map 学习笔记(不定时更新)
本篇笔记纯属个人的一些理解,可能理解有误或者术语不当,还请理解
开头:
传送门
首先声明,此题我并没有过,正解是欧拉函数。
这虽然是一道数学题,但我用它来练习一下
思路很简单,求各点斜率,如果不同说明合法。
但由于斜率
那正好就练习一下
map <double,bool>k;
int main(void)
{
cin >> n;
for(int i=1;i<n;i++)
for(int j=1;j<i;j++)
{
map <double,bool> :: iterator it;
it = k.find((double)i/j);
if(it == k.end())
{
k[(double)i/j] = 1;
ans++;
}
}
/*
map <double,bool> :: iterator it;
for(it=k.begin();it!=k.end();it++)
{
cout << it->first << endl;
}*/
cout << 2*ans+3;
}
代码大概就是这样,不过这样做并不会
好,我来填坑了,这道题正解是欧拉函数,详情请见
正文:
现在,来学习一下
这里,就要说一下
通常,
如果是结构体类型,则可以自定义默认值
//举个栗子:
struct node{
int a{5};
};
map<string,node> m1;
cout << m1["s"].a << endl;
//这时的输出为 5
2018.10.14 10:04
实例练习:
传送门
虽然这道题我用了
练
int vis[MAXN];
queue <int> que;
struct node{
set <int> s;
}group[MAXN];
int main(void)
{
scanf("%d%d",&n,&g);
for(int i=1;i<=g;i++)
{
scanf("%d",&num);
for(int j=1;j<=num;j++)
{
scanf("%d",&cow);
group[i].s.insert(cow);
}
}
que.push(1);
ans = 1;
while(!que.empty())
{
int u = que.front();
que.pop();
for(int i=1;i<=g;i++)
{
group[i].s.erase(u);
int x = *group[i].s.begin();
if(group[i].s.size()==1 && !vis[x])
{
que.push(x);
vis[x] = 1;
ans++;
}
}
}
cout << ans;
return 0;
}
注:
这里穿插一些
实例练习:
传送门
值得注意的是,
再来说说这道题,主体是贪心,存下没变规则前能赢几把的前缀和与改变后能赢几把的后缀和,枚举
与田忌赛马类似,要用一张与
至于正确性的证明,可以这么想 :
在贪心时唯一可能出错的问题在于前后缀中可能重复使用了某一张牌,但如果出现重复使用的情况,必有某一张没有被用到,这里设重复使用的那张为
int n,ans;
int a[MAXN];
int vis[MAXN];
int f[MAXN],g[MAXN];
set <int>s1,s2;
int main(void)
{
cin >> n;
for(int i=1;i<=n;++i)
{
cin >> a[i];
vis[a[i]] = 1;
}
for(int i=1;i<=2*n;++i)
if(!vis[i])
{
s1.insert(i);
s2.insert(-i);
}
for(int i=1;i<=n;++i)
{
set <int>:: iterator it = s1.lower_bound(a[i]);
if(it != s1.end())
{
f[i] = 1;
s1.erase(it);
}
f[i] += f[i-1];
}
for(int i=n;i>=1;--i)
{
set <int>:: iterator it = s2.lower_bound(-a[i]);
if(it != s2.end())
{
g[i] = 1;
s2.erase(it);
}
g[i] += g[i+1];
}
for(int i=0;i<=n;i++)
ans = max(ans,f[i]+g[i+1]);
cout << ans;
return 0;
}
2018.10.17 20:44
实例练习:
传送门
短小而精悍,用
vector <int> a;
int main(void)
{
int n,F,K=0; cin >> n;
for(int i=1;i<=n;i++)
{
cin >> F;
a.insert(lower_bound(a.begin(),a.end(),F),F);
if(!(i&1)) continue;
cout << a[K++] << endl;
}
return 0;
}
实在是没有时间开新坑了,关于
2018.10.31 14:43