摘要:题意:n*n的矩阵定义两种操作:1 x y a 把(x,y)的权值加a2 l b r t 查询 子矩阵(l,b) ~(r,t) 的和思路:二维树状数组 1 #include<iostream> 2 using namespace std; 3 #define MAXN 1200 4 int tree[MAXN][MAXN]; 5 int n; 6 int lowbit(int x) 7 { 8 return x&(x^(x-1)); 9 }10 void update(int x,int y,int a)11 {12 for(int i=x;i<=n;i+=lowbi
阅读全文
摘要:物理题+数学题+信息学题 1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 #define MAXN 101 5 #define PI 3.1415926 6 struct point 7 { 8 double x,y; 9 };10 point a[MAXN];11 double h,k;12 double Max=0,Min=0,sum=0;13 int n;14 double angle(point A,point B)15 {16 double k1=atan2(A.y,A.x);17
阅读全文
摘要:题意:给一棵树,每个节点都有颜色,最多有10种颜色定义:两种操作0 u c 把编号为u的节点颜色改为c1 u v 求树上u~v的路径中,颜色出现的次数的最大值思路:用color[i][j]记录根节点到节点i,j颜色的出现次数。 c[i]记录i的颜色先用ST求LCA 对于每个询问 ans=max(color[u][i]+color[v][i]-2*color[LCA(u,v)][i]+c[LCA(u,v)]==i)然后dfs,记录开始时间low[i]和结束时间high[i],更改操作相当于,更改一个区间[low[i],high[i]] 线段树求解 1 #include<iostream&g
阅读全文
摘要:题意:求有几组满足 a+b^2-c^3=0(mod k) 1<=a<=b<=c<=n (a,b,c)。思路:树状数组注意到 当b固定时 考虑a 1~b%k有b/k+1 b%k+1~k 有b/k个从大至小枚举b,每次tree[b^3%k]++ 查询 (1+b*b)%k~(b%k+b*b)%k 总和sum*(b/k+1)+(sum总-sum)*b/k 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 using nam
阅读全文
摘要:题意:给一个凸多边形,求以凸多边形的顶点为顶点的三角形中,有多少个面积小于给定数值K?思路:旋转卡壳+二分答案时间复杂度:n^2logn 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 #define MAXN 1001 7 struct point 8 { 9 long long x,y; 10 point() {} 11 point(long long x0,long long(y0))
阅读全文
摘要:题意:给一个曲折的管道,求从入口射入的光线到达最远的位置的X左标.思路: 到达最远的光线一定经过上方和下方的折点,枚举即可。 1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 using namespace std; 5 #define MAXN 21 6 #define EPS 1e-8 7 #define INF 1<<30 8 struct point 9 { 10 double x,y; 11 point() {} 12 point(double x0,double y
阅读全文
摘要:题意:给出一个100*100的正方形区域,有若干端点在区域边界的线段是墙,然后给出宝藏位置,要求从区域外部开辟到宝藏所在位置的一条路径,使得开辟路径所需要打通的墙壁数最少("打通一堵墙"即在墙壁所在线段中间位置开一空间以连通外界),输出应打通墙壁的个数(包括边界上墙壁)。思路:因为墙的端点都在区域边界上,所以从区域外部到宝藏所在位置的路径一定是直线。可以枚举每个入口,和宝藏位置连成线段,输出与给定线段交点个数的最小值+1。(严格相交)入口可以选取所有线段的端点。n=0 输出1 1 #include<iostream> 2 #include<cmath>
阅读全文
摘要:题意:给一堆操作,维护数列。思路:平衡树 splayP.S. 太恶心了…… 1 #include<iostream> 2 #include<cstring> 3 #include<cmath> 4 using namespace std; 5 #define MAXN 110004 6 #define MAXM 110000 7 struct node 8 { 9 int left,right,father; 10 int value,size,min; 11 int adt; 12 bool rev; 13 }; 14 int INF=987...
阅读全文
摘要:题意:定义3种操作1 x y 把编号为x,权值为y的人加入队列2 询问权值最大的人的编号3 询问权值最小的人的编号思路:(1) Splay (2)STL set 1 #include<iostream> 2 using namespace std; 3 #define MAXN 1000001 4 struct node 5 { 6 int left,right,father; 7 int key; 8 int leftnum,rightnum; 9 }; 10 node tree[MAXN]; 11 int root=0; 12 void up...
阅读全文
摘要:题意:输入n个字符串,求每个字符串的最短非公共前缀,若没有输出其本身思路:Trie水题 1 #include<iostream> 2 using namespace std; 3 #define MAXL 21 4 #define MAXN 1001 5 struct node 6 { 7 int count; 8 node *next[30]; 9 };10 int n=0;11 node *root;12 int top=0;13 int end_node;14 node memo[MAXN*MAXL];15 void insert(char c[])16 {17 ...
阅读全文
摘要:题意:给一组互不相同的序列,问其中是否有字符串是另一字符串的前缀思路:Trie树水题 1 #include<iostream> 2 using namespace std; 3 #define MAXN 100010 4 struct node 5 { 6 bool end; 7 node *next[10]; 8 }; 9 node *root;10 int top=0;11 bool is_new,ans;12 node memo[MAXN];13 void insert(node *t,char c[],int i)14 {15 if(t->end)16 ...
阅读全文
摘要:题意:给定n个疾病DNA序列,和一个待修复序列str。用最小的次数修改待修复序列,使其不含疾病DNA序列。思路:AC自动机+DP建自动机 并加上虚拟节点 每一个节点作为一个dp第二维状态dp[i][j] 表示修复str前i个字符,且当前状态为j的最小修改次数str从1开始 AC自动 树根标号为0 dp[0][0]=0;dp[i+1][j]=min(dp[i+1][j],dp[i][j]+(j代表的当前字符!=str[i+1]))ans=min(ans,dp[m-1][j]); (0<=j<top) top是自动机节点数 1 #include<iostream> 2 us
阅读全文
摘要:题意:给定M个疾病DNA序列,求组成长度为N的DNA序列的个数,其字串不含疾病DNA,答案模100000。思路:AC自动机+矩阵快速幂先建自动机,注意某给定的疾病DNA序列是另一疾病DNA序列的子串的情况。 这种情况可以在建立失败链接的时候搞定。之后自动机上 每一个节点作为一个状态,总共node_num个状态node_num<=101。题目可以转换在一个有向图里,从i开始走k步一共有多少条路径。答案是有向图的邻接矩阵的k次方 输出G[i][1]+……+G[i][n]建立一个node_num*node_num 的矩阵 进行矩阵快速幂 具体转化详见http://hi.baidu.com/%D
阅读全文
摘要:题意:给n个字符串,求一个最长的子串至少出现在[n/2+1]个字符串中思路:后缀数组 把所有字串连一起,并用不同的字符隔开 二分P.S. 1. 我的程序C++WA,G++ AC 2. 为什么char的上界是127啊 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 #define MAXN 110000 6 int n,m; 7 int suffix_array[MAXN]; 8 int rank[2*MAXN],oldrank[2*MAX
阅读全文
摘要:题意:求可相交的重复k次串思路:后缀数组+二分 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 #define MAXN 20001 6 struct number 7 { 8 int num,id; 9 }; 10 number a[MAXN]; 11 int b[MAXN]; 12 int suffix_array[MAXN]; 13 int cnt[MAXN]; 14 int tmp[MAXN]; 15 int rank[MA
阅读全文
摘要:基本和poj 1823 hotel基本一样 只需加一个find函数 1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 #define MAXN 50001 5 struct node 6 { 7 int lmax,rmax,max; 8 int left,right; 9 int flag; 10 int r; 11 }; 12 node tree[MAXN*4]; 13 void build(int i) 14 { 15 tree[i].lmax=tree[...
阅读全文
摘要:题意:一个hotel,有n个连续的房间,开始时均无人住宿共有3种操作1 a b 从a开始连续b个房间全部旅客住宿 [a,a+b-1];2 a b从a开始连续b个房间全部旅客离开[a,a+b-1];3 查询最长连续空房间思路:线段树,记录每个节点,左边,右边各最多连续空房间lmax,rmax; 以及这个区间内最多空房间max 1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 #define MAXN 16001 5 struct node 6 { 7 int lmax,rmax,max; 8 .
阅读全文
摘要:题意:平面上有n个星星,给出每个星星的位置和亮度 求一个W*H的矩形(不包括边界)使得矩形内的星星亮度之和最大。思路:每个点(x,y,brightness) 存两个点(x,y,brightness)和(x,y+H,-brightness)先离散化从左到右两根间距为W的扫描线,左开右闭。依次把点加进线段树,下标是y,权值是brightness,题目所求的就是前i个点的和的最大值。线段树存当前范围内的sum,maxsum其中 maxsum[i]=max(maxsum[2*i],sum[2*i]+maxsum[2*i+1]);ans=max(maxsum[i]) 1 #include<iost
阅读全文