[NOI2010]能量采集
暴力80,不说话/
CODE:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=1e5+10; int n,m; long long ans,f[maxn]; int main() { scanf("%d%d",&n,&m); int Max=min(m,n); for(int i=Max;i>=1;i--) { f[i]=(long long)(n/i)*(m/i); for(int j=2;j*i<=Max;j++) f[i]-=f[i*j]; ans+=f[i]*(i+i-1); } printf("%lld\n",ans); return 0; }
[NOI2010]航空管制
先建图
1、输出方案很simple,拓扑排序后贪心地选择 t 值最小的先起飞,题目保证有解。
2、第二问反向建图,贪心地让每架飞机尽量最晚被加入队列,在实在没有合法的起飞飞机的时候就是每架飞机在反图中的最晚时间。
CODE:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #define MP(a,b) make_pair(a,b) using namespace std; const int maxn=20003; struct point { int to; int nxt; }edge[maxn*2]; int n,m,tot; int head[maxn],t[maxn],IN[maxn],in[maxn],ans1[maxn],nn; typedef pair<int,int> mp; priority_queue<mp> q; inline void add(int u,int v) { tot++; edge[tot].nxt=head[u]; edge[tot].to=v; head[u]=tot; } inline int ask(int x) { while(!q.empty()) q.pop(); memcpy(IN,in,sizeof(in)); IN[x]=n; for(int i=1;i<=n;i++) if(!IN[i]) q.push(MP(t[i],i)); for(int i=n;i>=1;i--) { if(q.empty() || q.top().first<i) return i; int tt=q.top().second;q.pop(); for(int j=head[tt];j;j=edge[j].nxt) { int v=edge[j].to; IN[v]--; if(!IN[v]) q.push(MP(t[v],v)); } } printf("OKKK\n"); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&t[i]); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); add(v,u); in[u]++; } memcpy(IN,in,sizeof(in)); for(int i=1;i<=n;i++) if(IN[i]==0) q.push(MP(t[i],i)); while(!q.empty()) { int x=q.top().second; ans1[++nn]=x; q.pop(); for(int i=head[x];i;i=edge[i].nxt) { int v=edge[i].to; IN[v]--; if(!IN[v]) q.push(MP(t[v],v)); } } for(int i=nn;i>=1;i--) printf("%d ",ans1[i]); printf("\n"); for(int i=1;i<=n;i++) printf("%d ",ask(i)); return 0; }