随笔分类 - OJ--URAL
摘要:1890将树的每个节点都转换为区间的形式 然后再利用线段树对结点更新 这题用了延迟标记 相对普通线段树 多了dfs的转换 把所要求的转换为某段区间RE了N次 最后没办法了 记得有个加栈的语句 拿来加上A了。。 1 #pragma comment(linker, "/STACK:102400000,102400000") 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 #define N 50010 10 #define LL long lon
阅读全文
摘要:1350这题没什么 就考一下map的用法吧 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 mapq; 8 int f[110]; 9 char s1[110][44],ss[45];10 int o[110],p[110];11 int main()12 {13 int i,j,n,k,t;14 scanf("%d",&n);15 for(i = 1; i (n-p[k+1]-t))43 printf("NO\n");44 ...
阅读全文
摘要:1521根据区间和 来确定第k个数在哪 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 100010 8 int s[N>1;21 build(l,m,w>1;34 if(k=r)43 {44 return s[w];45 }46 int m = (l+r)>>1,re=0;47 if(am)50 re+=getsum(a,b,m+1,r,w<<1|1);51 return re;5...
阅读全文
摘要:1003看篇国家论文《从《parity》的解法谈程序优化》对于区间i,j 如果用sum[i],sum[j]来表示到i的1的个数的奇偶性 那么仔细想下 sum[i-1] 若与区间i,j相等 则sum[j]为偶 否则为奇那么就可以把性质相同的合并在一个集合里 性质相同为朋友 不同为敌人 可以把一个端点分成两个 一个是自己一个是他的敌人 当与别的点合并时根据朋友的朋友是朋友 朋友的敌人是敌人 敌人的敌人 是朋友 这些原则 来进行合并 ,并判断是不是有矛盾端点比较大 用map离散化下 map相对其它离散化方法操作还是比较简单点 1 #include 2 #include 3 #include ...
阅读全文
摘要:1470最简单的三维树状数组 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define lowbit(x) x&(-x) 8 int re[130][130][130],n; 9 int getsum(int x,int y,int z)10 {11 int s = 0,i,j,g;12 for(i = x; i >= 1 ; i -= lowbit(i))13 for(j = y ; j>= 1; j -= lowbit(j))14 ...
阅读全文
摘要:1471先学习了下tarjan算法的LCA 离线算法 它是先知道询问的结点对 在遍历的时候就已经算出来了看篇图解 讲的很清楚 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 100010 8 struct node 9 {10 int u,v,w,next;11 }ed[N<<2];12 int head[N],t,n,q,dis[N];13 int vis[N],ans[N],qhead[N<<2];14 int father[N],x[
阅读全文
摘要:1494之前记得数据结构试卷上有这种题 就是判断某一出栈顺序 是不是满足以1.2。。。n为入栈顺序a1,a2,a3..an;对于任意相邻a[i],a[i+1] 如果a[i]>a[i+1]+1 那么它两之间的数肯定已经在前面出栈过了 不然中间的不出栈 a[i+1]不可能出来这一个条件就可以判断了 用数状数组求下和 就行了 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 100010 8 #define lowbit(x) x&(-x) 9 int f[
阅读全文
摘要:1220又一神题啊 卡内存可以卡到这种地步 省得不行了开两个【N]数组 一个来记录前驱 一个存数 记录前驱的用unsigned short类型 最大可达65535 不过可以标记一下是否比这个数大 比它大的话就减去 求的时候再加上 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 100010 8 unsigned short p2[N]; 9 int p1[N];10 int stack[1010];11 int main()12 {13 int n,a,...
阅读全文
摘要:1671并查集 对于询问删除边之后的连通块 可以倒着加边 最后再倒序输出 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 100010 8 int p[N],father[N],a,b,f[N]; 9 int pp[N];10 struct node11 {12 int x,y;13 }ed[N];14 int find(int x)15 {16 if(father[x]!=x)17 father[x] = find(father[x])...
阅读全文
摘要:1613高端的东西lower_bounder函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的然后用map 把数映射成容器 可以简单查询到每个数出现的最前和最后位置 再与给出的L,R相比较 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 #define N 7001010 map >t;11 v
阅读全文
摘要:1306URAL真是没水题 以为简单的排序就好了 ME 内存限制很紧 堆排序 或者 STL用堆排序做的 正好复习一下 都忘了 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 1250010 8 int a[N]; 9 void adjust(int i,int n)10 {11 int j;12 a[0] = a[i];13 j = 2*i;14 while(ja[j])17 j++;18 if(a...
阅读全文
摘要:1126最简单的单调队列应用吧单调队列是指在一个队列中各个元素单调 递增(或者递减),并且各个元素的下标单调 递增。单调队列的大体操作进队时,将进队的元素为e,从队尾往前扫描,直到找到一个不大于e的元素d,将e放在d之后,舍弃e之后的所有元素;如果没有找到这样一个d,则将e放在队头(此时队列里只有这一个元素)。出队时,将出队的元素为e,从队头向后扫描,直到找到一个元素f比e后进队,舍弃f之前所有的。(实际操作中,由于是按序逐个出队,所以每次只需要出队只需要比较队头)。每个元素最多进队一次,出队一次,摊排分析下来仍然是 O(1)。 1 #include 2 #include 3 #includ.
阅读全文
摘要:链接dfs+记忆化 对于当前状态虽然满足和差 但如果搜下去没有满足的情况也是不可以的 所以需要记忆化下 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 char s1[1010],s2[1010]; 8 int dp[1010][1010]; 9 int sum1,sum2;10 int p[2010],n,flag;11 int ss1[1010],ss2[1010];12 int st1[1010],st2[1010];13 int dfs(int x,int y,int v,.
阅读全文
摘要:链接以前做的题 VJ太水了 数组里面的数可能会小于0 当时没判断 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int dp[100010],w[110],path[110],o,f[110],n,ff[110]; 8 int flag,tw; 9 void dfs(int sw,int v,int u)10 {11 int j,i;12 if(flag) return ;13 path[v] = u;14 if(sw==0)15 {16 ...
阅读全文
摘要:链接这题卡了挺久了 昨天试着用类似dfs的方法直接TLE在第二组 看了下题解,,发现s1,s2的范围是个幌子。。100位最大的s1900 s28100 觉得s1s2太大不敢开二维。。这样就简单了 类似背包 dp[s1][s2]表示组成s2s2最少的位数 其实就是装进去多少个数字 正好把s1s2装满把DP部分预处理之后放在外面 不然会超时 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define INF 0xfffffff 8 int s1,s2; 9 int dp[920][.
阅读全文
摘要:链接先初始化一下所有的回文串 再O(n*n)DP输出路径dfs 刚开始存所有回文 ME了 后来发现用不着 改了改了OK了 数据还挺强 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 4010 8 #define INF 0xfffffff 9 int dp[N]; 10 char s[4010]; 11 int path[2][4010],o[4010],q[4010][4010],k; 12 int g,flag,pp[2]; 13 void...
阅读全文
摘要:这几天扫了一下URAL上面简单的DP 第一题 简单递推1225. Flags 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define LL long long 7 LL dp[50][4]; 8 int main() 9 {10 int i,n;11 scanf("%d",&n);12 dp[1][1] = 1;dp[1][2] = 1;13 for(i =2 ; i 2 #include 3 #include 4 #include 5 #include 6 u...
阅读全文
摘要:链接dp[i][j] += dp[i-1][j-g];背包吧数据太大了 还是JAVA好用 1 import java.io.*; 2 import java.math.*; 3 import java.text.*; 4 import java.util.*; 5 public class Big { 6 public static void main(String[] args) 7 { 8 Scanner cin = new Scanner (System.in); 9 BigInteger[][] dp;10 dp = n...
阅读全文
摘要:链接路径麻烦啊 很多细节 倒回去搜一遍卡了一节数据库。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define LL long long 8 int u,o,path[50010],flag; 9 LL sum[110][510],dp[110][510],f[110][510]; 10 int m,n; 11 void dfs(int u,int v) 12 { 13 if(flag) 14 return ; 15 int i,...
阅读全文
摘要:链接考查大数 正好拿来学习下JAVA JAVA好高端。。 1 import java.io.*; 2 import java.math.*; 3 import java.text.*; 4 import java.util.*; 5 public class Main 6 { 7 8 public static void main(String[] args) 9 {10 Scanner cin = new Scanner (System.in);11 BigInteger[][] dp;12 int n,k,i,j,g;13...
阅读全文

浙公网安备 33010602011771号