hdu 5363
/******************hdu 5363 ********************** /*求一个集合元素里偶数和的子集个数 #pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> pii; const int N = 1000005 + 10; const int MOD=1000000007; LL t,n,m; LL poww(LL a,LL b,LL MOD) { LL res=1; while(b) { if(b&1) res=(res*a)%MOD; a=a*a%MOD; b>>=1; } return res; } int main() { while(~scanf("%I64d",&t)) { for(int i=0; i<t; ++i) { scanf("%I64d",&n); m=poww(2,n-1,MOD); m+=MOD; printf("%I64d\n",(m-1)%MOD); } } return 0; }
hdu 5360
【解题思路】:
结构体 + 优先队列,首先第一个人的L[i]必须是0,然后在同样的下标为L[i]的进队列,然后队列中的元素按照r[i]的大小排序,使得R[i]最小的优先
/*题意:现在有n个人,然后soda想要n个人尽可能多的去野营,每个人去野营是要在soda询问他时,
每个人所知道的去的人数大于等于L[i] 小于等于R[i] 然后问哪种询问顺序,可以使去的人数最多 */ #pragma comment(linker, "/STACK:1024000000,1024000000") #include <bits/stdc++.h> using namespace std; const int N=1000005; struct item{ int ll,rr,id; bool operator < (const item &aa) const{ return rr>aa.rr; } item(){ ll=0; rr=0; id=0; } }s[N]; bool cmp(item a,item b){ if(a.ll!=b.ll) return a.ll<b.ll; return a.rr<b.rr; } int num[N]; int main(){ //freopen("1.txt","r",stdin); int T,n;scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=0; i<n; ++i) scanf("%d",&s[i].ll); for(int i=0; i<n; ++i) scanf("%d",&s[i].rr),s[i].id=i+1; sort(s,s+n,cmp); /* cout<<"bug begin!!!!!!!!!!!!!!!"<<endl; for(int i=0; i<n; ++i) cout<<"s[i].id="<<s[i].id<<" "<<"s[i].ll="<<s[i].ll<<" "<<"s[i].rr="<<s[i].rr<<endl; cout<<"bug end!!!!!!!!!!!!!!!"<<endl; */ priority_queue <item>val; while(!val.empty()) val.pop(); if(s[0].ll!=0){ ///第一个元素不符合 puts("0"); for(int i=0; i<n; ++i) printf("%d%c",i+1,i==n-1?'\n':' '); continue; } int i=1,cur=0,c1=0,c2=n-1;///cur:邀请人个数,c1:接受人数 val.push(s[0]); while(!val.empty()){ // cout<<"bug begin!!!!!!!!!!!!!!!"<<endl; // cout<<"cur="<<cur<<" pre c1="<<c1<<" "<<"val.top().id="<<val.top().id<<" "<<"val.top().ll="<<val.top().ll<<"val.top().rr="<<val.top().rr<<endl // cout<<"bug end!!!!!!!!!!!!!!!"<<endl; for(;s[i].ll==cur&&i<n;++i) val.push(s[i]); while(!val.empty()){ if(val.top().rr>=cur){ int t=val.top().id; num[c1++]=t; cur++; val.pop(); break; } else num[c2--]=val.top().id; val.pop(); } for(;s[i].ll==cur&&i<n; ++i) val.push(s[i]); // cout<<"last c1="<<c1<<endl; } // cout<<"zhong ce c1="<<c1<<endl; for(; i<n; ++i) num[c2--]=s[i].id; printf("%d\n",c1); for(int i=0; i<n; ++i) printf("%d%c",num[i],i==n-1?'\n':' '); } return 0; }
/****************hdu 5355 ****************** #pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> pii; const int N =2e5 + 10; const int MOD=1000000007; bool vis[N]; int ans[N]; int t,n,m; int main() { scanf("%d",&t); while(t--){ scanf("%d %d",&n,&m); memset(ans,0,sizeof(ans)); int sum=((n+1)*n)/2; int mm=sum/m; if(sum%m==0&&mm>m){ puts("YES"); memset(vis,false,sizeof(vis)); while(m--){ int su=0; int cnt=0; for(int i=n;i>=1;i--){ if(!vis[i]&&su+i<=mm){ vis[i]=true; ans[cnt++]=i; su+=i; if(su==mm){ break; } } } sort(ans,ans+cnt); printf("%d %d",cnt,ans[0]); for(int i=1; i<cnt; ++i) printf(" %d",ans[i]); puts(""); } } else puts("NO"); } return 0; }