标签:ditu 03 node int long ++ 训练赛 ans 2019
题目链接 https://codeforc.es/group/w1oiqifZbS/contest/616
虽然我当时没A出来 但是我补完了 哼!
A题 大数字比较问题,有前导0,需要手动去除
莫名其妙re了一发,然后就心态暴毙了
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
vector<char>a1,a2;
int main()
{
cin>>s1>>s2;
int f=0;
for(int i=0;i<s1.size();i++)
{
if(f==0)
{
if(s1[i]!='0')
{a1.push_back(s1[i]);
f=1;}
}
else
a1.push_back(s1[i]);
}
f=0;
for(int i=0;i<s2.size();i++)
{
if(f==0)
{
if(s2[i]!='0')
{a2.push_back(s2[i]);
f=1;}
}
else
a2.push_back(s2[i]);
}
if(a1.size()<a2.size())
cout<<'<'<<endl;
else if(a1.size()>a2.size())
cout<<'>'<<endl;
else
{
for(int i=0;i<a1.size();i++)
if(a1[i]>a2[i])
{cout<<'>'<<endl;return 0;}
else if(a1[i]<a2[i])
{cout<<'<'<<endl;return 0;}
cout<<'='<<endl;
}
}
B题 求每行最小值的最大值
读错题,求了半天每列最小值的最大值
#include<bits/stdc++.h>
using namespace std;
long long ditu[106][106];
int main()
{
int n,m;
long long ans=-1;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>ditu[i][j];
for(int i=1;i<=n;i++)
{
long long xx=99999999999;
for(int j=1;j<=m;j++)
{
xx=min(xx,ditu[i][j]);
}
ans=max(ans,xx);
}
//for(int i=0;i<t;i++)cout<<a[i].da<<' '<<a[i].xi<<endl;
cout<<ans<<endl;
}
C题 垃圾BFS染色问题,也就我这么沙雕的人才A不出来
还有就是c++11不支持auto,鬼知道前十个样例auto怎么过的
就是每个*能到多少个位置去 每个。表示可以去的位置,只能上下左右移动,不可以去其他*的地方
#include<bits/stdc++.h>
using namespace std;
int ditu[1006][1006];
int ans[1006][1006];
char mp[1006][1006];
int t=10;
int n,m;
int kkk[1000006];
struct node
{
int x,y;
node(int a,int b):x(a),y(b){};
};
bfs(node a)
{
queue<node>q;
q.push(a);
ditu[a.x][a.y]=t;
int ans=1;
while(!q.empty())
{
node u=q.front();
q.pop();
if(ditu[u.x-1][u.y]==-1)
{
node k(u.x-1,u.y);
ans++;
ditu[u.x-1][u.y]=t;
q.push(k);
}
if(ditu[u.x+1][u.y]==-1)
{
node k(u.x+1,u.y);
ditu[u.x+1][u.y]=t;
ans++;
q.push(k);
}
if(ditu[u.x][u.y-1]==-1)
{
ans++;
node k(u.x,u.y-1);
ditu[u.x][u.y-1]=t;
q.push(k);
}
if(ditu[u.x][u.y+1]==-1)
{
ans++;
node k(u.x,u.y+1);
ditu[u.x][u.y+1]=t;
q.push(k);
}
}
kkk[t]=ans;
t++;
}
int main()
{
cin>>n>>m;
char c;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>c;
mp[i][j]=c;
if(c=='.')
ditu[i][j]=-1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(ditu[i][j]==-1)
{
node a(i,j);
bfs(a);
}
}
///染色,分块记录序号,kkk数组存放每个块的大小从10下标开始
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
set<int>lll;
if(mp[i][j]=='*')
{
lll.insert(ditu[i-1][j]);
lll.insert(ditu[i+1][j]);
lll.insert(ditu[i][j-1]);
lll.insert(ditu[i][j+1]);
for(auto it=lll.begin();it!=lll.end();it++)
{
ans[i][j]+=kkk[*it];
}
ans[i][j]++;
}
}
}
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
cout<<ditu[i][j]<<' ';
cout<<endl;
}*/
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
if(mp[i][j]!='.')
cout<<ans[i][j]%10;
else
cout<<mp[i][j];
cout<<endl;
}
}
D:给个n数组,给个m,求个n的子序列,要求子序列中数字种数不能超过m种,
尺取撑死跑个O(n*2)的时间,早知道先写D了
因为这题所有数字在1e6以内,所以可以开个数组记录当前l,r之间的各种数字数量
如果数字范围再大点呢???
可以用map<int,int>来存放每个数字数量,就是时间会变为O(nlogn)
还有种写法是二分长度,然后跑一遍数组,时间较长,再改个数据范围用下map很可能TLE
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
int a[N];
int cnt[N];
int num;
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
int l=1,r=1;
int len=0;
int ansl=1,ansr=n;
while(r<=n)
{
cnt[a[r]]++;
if(cnt[a[r]]==1)
num++;
if(num>m)
{//cout<<l<<' '<<r<<endl;
while(num>m)
{
cnt[a[l]]--;
if(cnt[a[l]]==0)
num--;
l++;
}
}
//cout<<l<<' '<<r<<endl;
if(r-l+1>len)
{
ansl=l;
ansr=r;
len=r-l+1;
}
//len=max(l-r+1,len);
r++;
}
cout<<ansl<<' '<<ansr<<endl;
}
E 自己看,自己推,自己想吧!数学题呀
数学打表找规律啊!
整除分块(莫比乌斯反演的前置知识点)
https://www.cnblogs.com/0xfffe/p/9648943.html
反正读题时一脸懵逼写完也是一脸懵逼
#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
const long long div2=5e8+4;
int main()
{
long long n,m;
cin>>n>>m;
long long ans=(n%mod)*(m%mod)%mod;
for(long long l=1,r;l<=n;l=r+1)
{
r=n/(n/l);
long long R=min(r,m);
if(R<l)break;
long long a=R-l+1;
long long b=R+l;
a%=mod; b%=mod;
long long a1=(a*b)%mod;
a1=(a1*div2)%mod;
a1=(a1*((n/l)%mod))%mod;
ans=ans+mod-a1;
ans%=mod;
//cout<<l<<' '<<r<<endl;
//cout<<ans<<endl;
}
cout<<(ans+mod)%mod<<endl;
}
标签:ditu,03,node,int,long,++,训练赛,ans,2019 来源: https://blog.csdn.net/permi_yaxileni/article/details/94586059
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。