码迷,mamicode.com
首页 > 其他好文 > 详细

CQOI2015 后3题解题报告

时间:2015-04-27 23:04:32      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

这个嘛= =,CQOI我只做了后面3题(前面两题老师还没考就还不敢写= =)说一下被虐报告吧= =

T3:[CQOI2015]任务查询系统

描述:戳我~~~

这道题首先很明显是道裸的数据结构题啦。首先他要求在线,那么按顺序建个函数式线段树就行啦

自己太弱调了好久= =

CODE:

技术分享
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 typedef long long ll;
 8 #define pb push_back
 9 #define maxn 100100
10 struct qnode{
11     int x,y,z;
12 }q[maxn*2];
13 int l;
14 inline void add(int x,int y,int z) {q[++l]=(qnode){x,y,z};}
15 bool cmp(qnode x,qnode y) {return x.x<y.x;}
16 struct node{int lc,rc,sum;ll s;}t[maxn*64];
17 #define mid (l+r>>1)
18 int cnt=0;
19 int ins(int x,int l,int r,int y,int z){
20     int root=++cnt;
21     t[root]=t[x];
22     t[root].s+=y*z;
23     t[root].sum+=z;
24     if (l==r) return root;
25     if (y<=mid) t[root].lc=ins(t[x].lc,l,mid,y,z);
26     else t[root].rc=ins(t[x].rc,mid+1,r,y,z);
27     return root;
28 }
29 ll que(int x,int l,int r,int &k){
30     if (t[x].sum<=k) {
31         k-=t[x].sum;return t[x].s;
32     }
33     if (l==r) {ll ans=l*1ll*k;k=0;return ans;}
34     ll ans=que(t[x].lc,l,mid,k);
35     if (k) ans+=que(t[x].rc,mid+1,r,k);
36     return ans;
37 }
38 vector<int> a;
39 int s[maxn],e[maxn],p[maxn],root[maxn];
40 int main(){
41     int n,m;
42     scanf("%d%d",&n,&m);
43     a.pb(0);
44     for (int i=1;i<=n;i++) {
45         scanf("%d%d%d",s+i,e+i,p+i);
46         e[i]++;
47         a.pb(s[i]);a.pb(e[i]);
48     }
49     sort(a.begin(),a.end());
50     a.resize(unique(a.begin(),a.end())-a.begin());
51     for (int i=1;i<=n;i++) {
52         add(lower_bound(a.begin(),a.end(),s[i])-a.begin(),p[i],1);
53         add(lower_bound(a.begin(),a.end(),e[i])-a.begin(),p[i],-1);
54     }
55     sort(q+1,q+1+l,cmp);
56     #define inf 10000000
57     for (int i=1;i<=l;i++) root[q[i].x]=ins(root[q[i-1].x],1,inf,q[i].y,q[i].z);
58     ll pre=1;
59     for (int i=1;i<=m;i++) {
60         int x,ai,bi,ci;
61         scanf("%d%d%d%d\n",&x,&ai,&bi,&ci);
62         int k=1ll+(ai*1ll*(pre%ci)%ci+bi)%ci;
63         pre=que(root[upper_bound(a.begin(),a.end(),x)-a.begin()-1],1,inf,k);
64         printf("%lld\n",pre);
65     }
66     return 0;
67 }
View Code

T4:[CQOI2015]多项式

描述:戳我~~~

又是高精度= =

首先我们可以换一下元,吧x-t换成x那就能得到技术分享

那么技术分享就能算5次即可啦,再考虑怎么快速算组合数技术分享

完成啦

CODE:

技术分享
  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #define maxb 4
  6 using namespace std;
  7 char s[10010];
  8 int p[9]={1,10,100,1000,10000,100000,1000000,10000000,100000000};
  9 struct bignum{
 10     int a[10010],n,flag;
 11     bignum(int x){
 12         n=0;memset(a,0,sizeof(a));
 13         flag=x<0?1:0;x=abs(x);
 14         while (x) {a[++n]=x%p[maxb];x/=p[maxb];}
 15         if (!n) n=1;
 16     }
 17     bignum(){n=1;memset(a,0,sizeof(a));flag=0;}
 18     int read(){
 19         scanf("%s",s);
 20         int len=strlen(s);
 21         n=0;
 22         if (len==1&&s[0]==0) {a[n=1]=0;return 0;}
 23         for (int i=len;i>=1;i-=maxb) {
 24             int t=0;
 25             if (i>maxb) for (int j=i-maxb+1;j<=i;j++) t=t*10+s[j-1]-0;
 26             else for (int j=1;j<=i;j++) t=t*10+s[j-1]-0;
 27             a[++n]=t;
 28         } 
 29         return 0;
 30     }
 31     int write(){
 32         if (flag) printf("-");
 33         printf("%d",a[n]);
 34         for (int i=n-1;i>=1;i--) {
 35             for (int j=1;j<maxb;j++) if  (a[i]<p[j]) printf("0"); 
 36             printf("%d",a[i]);
 37         }
 38         printf("\n");
 39         return 0;
 40     }
 41     int cmp(bignum x){
 42         if (x.n!=n) return (x.n<n);
 43         for (int i=n;i>=1;i--)
 44             if (x.a[i]!=a[i]) return (x.a[i]<a[i]);
 45         return -1;
 46     }
 47     int div(int x){
 48         int s=0;
 49         for (int i=n;i>=1;i--){
 50             s=a[i]+s*p[maxb];
 51             a[i]=s/x;
 52             s%=x;
 53         }
 54         if (n!=1&&!a[n]) n--;
 55         return s;
 56     }
 57 }a,b;
 58 bignum operator + (bignum x,bignum y){
 59     if (x.flag^y.flag && x.cmp(y)==0)swap(x,y);
 60     if (x.flag==y.flag) {
 61         x.n=max(x.n,y.n);
 62         for (int i=1;i<=x.n;i++) {
 63             x.a[i]+=y.a[i];
 64             x.a[i+1]+=x.a[i]/p[maxb];
 65             x.a[i]%=p[maxb];
 66         }
 67         if (x.a[x.n+1]) x.n++;
 68         return x;
 69     }
 70     for (int i=1;i<=x.n;i++) {
 71         x.a[i]-=y.a[i];
 72         if (x.a[i]<0) {x.a[i]+=p[maxb];x.a[i+1]--;}
 73         while (!x.a[x.n]&&x.n>1) x.n--;
 74     }
 75     return x;
 76 }
 77 bignum operator * (bignum x,bignum y){
 78     bignum ans;
 79     if (x.n==1&&x.a[1]==0) return ans;
 80     if (y.n==1&&y.a[1]==0) return ans;
 81     ans.flag=x.flag^y.flag;
 82     for (int i=1;i<=x.n;i++) 
 83         for (int j=1;j<=y.n;j++) {
 84             ans.a[i+j-1]+=x.a[i]*y.a[j];
 85             ans.a[i+j]+=ans.a[i+j-1]/p[maxb];
 86             ans.a[i+j-1]%=p[maxb];
 87         }
 88     int n=x.n+y.n-1;
 89     while (ans.a[n+1]) {
 90         n++;ans.a[n+1]+=ans.a[n]/p[maxb];
 91         ans.a[n]%=p[maxb];
 92     }
 93     ans.n=n;
 94     return ans;
 95 }
 96 int sum;
 97 int main(){
 98     static bignum n,m;
 99     int t;
100     n.read();
101     scanf("%d",&t);
102     m.read();
103     static int a[4000];
104     a[0]=1;
105     for (int i=1;i<=3389;i++) a[i]=(a[i-1]*1234+5678) % 3389;
106     static bignum tmp=m;
107     int l=tmp.div(3388);
108     static bignum ans,c=bignum(1),T=bignum(1);
109     int cnt=0;
110     for (bignum i=m;i.cmp(n)!=1;i=i+bignum(1),cnt++) {
111         ans=ans+c*T*bignum(a[l]);
112         l=(l+1)%3388;
113         c=c*(i+bignum(1));
114         c.div(cnt+1);
115         T=T*bignum(t);
116     }
117     ans.write();
118     return 0;
119 }
View Code

T5:[CQOI2015]标示设计

描述:戳我~~~

首先我们考虑轮廓线,那么每个L可能有四种状态:已经结束,还未开始,还没拐弯,已经拐弯,那么如果从上到下,从左到右做的话,可以发现最多只有3条横边被标记,那么对每个L我们可以用一维来存这个状态,在加上起始状态还有终止状态就行啦,然后已经拐弯的状态一定是在那条竖边上在讨论下就行啦

由于我是从左到右,从上到下做的,所以每一维就多了1倍的状态,所以在BZ上就光荣的TLE啦,不过在学校的oj上还是能过的。所以代码就不贴啦

CQOI2015 后3题解题报告

标签:

原文地址:http://www.cnblogs.com/New-Godess/p/4461428.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!