C题,刚开始以为遍历整个树,后来发现二重循环判断就行了
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-7; const int N=200000+10,maxn=500+100,inf=0x3f3f3f; vector<int>v[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n,m; cin>>n>>m; for(int i=0;i<m;i++) { int a,b; cin>>a>>b; v[a].push_back(b); v[b].push_back(a); } for(int i=0;i<v[1].size();i++) { int u=v[1][i]; for(int j=0;j<v[u].size();j++) { if(v[u][j]==n) { cout<<"POSSIBLE"<<endl; return 0; } } } cout<<"IMPOSSIBLE"<<endl; return 0; } /******************** ********************/
D题,根据数据范围可以看出n必须是50,否则a会大于1e16+1000,先枚举1到50的过程,然后加上去就行了
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-7; const int N=100+10,maxn=500+100,inf=0x3f3f3f; ll ans[N][N]; int main() { ios::sync_with_stdio(false); cin.tie(0); ll k; cin>>k; cout<<50<<endl; memset(ans,0,sizeof ans); for(int i=1;i<50;i++) { for(int j=0;j<50;j++) { if(j==i)ans[i][j]=ans[i-1][j]+50; else ans[i][j]=ans[i-1][j]-1; } } ll s=k/50,p=k%50; for(int i=0;i<50;i++) cout<<ans[p][i]+49ll+s<<(i==49?' ':' '); return 0; } /******************** ********************/
E题,直接每次把a[i]减到n以下(刚开始以为会超时就没写。。。)
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-7; const int N=1500+10,maxn=500+100,inf=0x3f3f3f; ll a[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); ll n,ans=0; cin>>n; for(int i=0;i<n;i++)cin>>a[i]; while(1){ ll maxx=-1e17,id; for(int i=0;i<n;i++) { if(a[i]>maxx) { maxx=a[i]; id=i; } } if(maxx<n)break; for(int i=0;i<n;i++) { if(i==id)a[i]%=n; else a[i]+=maxx/n; } ans+=maxx/n; } cout<<ans<<endl; return 0; } /********************* 10 1000 193 256 777 0 1 1192 1234567891011 48 425 *********************/