CQOI2015 后3题解题报告

这个嘛= =,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 }

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 }

T5:[CQOI2015]标示设计

描述:戳我~~~

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

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

时间: 2024-12-28 20:46:00

CQOI2015 后3题解题报告的相关文章

08年acm区域赛北京赛区 部分题解题报告

08年区域赛北京赛区 http://poj.org/searchproblem?field=source&key=Beijing+2008 POJ 3921 Destroying the bus stations 题目还是比较难的,当时的榜似乎只有4/25的通过/提交,其实题目数据很水.学长转换模型写了网络流求最小割,可以AC,不过自己造了个数据推翻了正确性.我写了个很挫的bfs套bfs,外层是最小的删除点数,内层是求最短路,数据很水可以AC.但比较蛋疼的在于bfs耗内存,而且队列中的点数是阶乘

圆锥曲线:椭圆小题解题报告

圆锥曲线:椭圆小题解题报告 注意事项: 由于本人水平有限,部分题目解题方法可能非最优解,如有更好方法欢迎在评论区指正. 部分题目讲解可能过于口语化,导致并不符合官方(人教版教材)的要求,请各位在考试中不要学习,使用正确的,符合要求的用语. 本文中可能存在错别字,望发现者在评论区指正. 本篇博客是为记录本人在完成学校作业的过程中遇到的问题,同时给部分同学作为解题参考用. 本篇博客中绘制图像的工具是geogebra. 1~10题: 1 题目: 已知F~1~,F~2~是椭圆\(x^2/4+y^2/3=

2016.8.27一套简单的题解题报告

一套不错的题,需要相关资料的联系我咯 考试分析: 1.  由于题目的名字加上第一道题没读完时我以为是我最不擅长的treeDP(其实不得不说,树和图上的题我真的是不想写,一般都写不对,上课太不认真,这个弱点要加强训练),我直接跳到了最后一道题,明知考3h还用了30min去分析,不过还是感谢,这30min救了我两道题出来: 这套题的确还是比较简单,后两道题只要认真分析数据都不会有问题,也许是因为暑假切了贪心和递推,我对分析数据比较在行,第三题切完之后还有2h,不过没写高精的我有点慌,打算最后留一点时

Codeforces Round #256 (Div. 2/A)/Codeforces448A_Rewards(水题)解题报告

对于这道水题本人觉得应该应用贪心算法来解这道题: 下面就贴出本人的代码吧: 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 5 int a[3],b[3]; 6 7 int main(void) 8 { 9 int n; 10 int need = 0; 11 int sum1 = 0,sum2 = 0; 12 for(int i=1;i<=3;++i){ 13 scanf("%d&q

灾后重建「解题报告」

P1119 灾后重建 Luogu P1119 题意 有n个村庄m条路,每个村庄都被地震摧毁,在某一时刻 \(t_i\)被修好.对于某条路,只有当它连接的两个村庄都被修好后才能通过.有q个询问,询问在某一时刻两村庄间的最短路. 第一行包含两个正整数 \(n,m\) . 第二行包含 \(n\) 个非负整数 \(t_0, t_1,-, t_{N-1}\),表示每个村庄重建完成的时间,数据保证了 \(t_0 ≤ t_1 ≤ - ≤ t_{N-1}\) 接下来 \(m\) 行,每行3个非负整数 \(i,j

9-25考试第三题解题报告(还是写了指针翻译神马的都是浮云感觉好久不说话连话都不会说了233333333QVO)

type link=^pnode; pnode=record w:longint; next:link; end; var a,root:array[0..1122] of longint; g:array[0..1100,0..1100] of longint; hash:array[0..1122] of boolean; list:array[0..1122] of link; n,min:longint; procedure init; begin assign(input,'badne

【算法学习笔记】29.规律题 解题报告 SJTU_OJ 1101 SuperXOR

1101. SuperXOR Description Pangzi recently realized that bitwise XOR operation is just an addition without carries. For example, when computing (1001)_2 XOR (1101)_2, you write down: 1001 + 1101 ------- 0100 You see, everything is like an addition, e

CodeForces 612C (STL_A题)解题报告

题目链接:http://codeforces.com/problemset/problem/612/C -------------------------------------------------------------------------------- 题意:有四种括号,按一定顺序出现,问能否完成括号的匹配,如果不能完成,最少更改几个括号能够完成括号匹配.(注意,左括号只能更换为左括号.同理右括号) 思路:本题具有这样的特征,在每次遇到括号的时候,如果不能完成括号的匹配,需要将新遇到

UVA 10815 (STL_C题)解题报告

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1756 -----------------------------------------------------------------------------------------------------------------------------------------