#include<stdio.h>#include<stdlib.h>typedef struct tree{char c;struct tree *l,*r;}t,*lt;char s[1010];int i=0;lt h;lt sol(){lt cur=(lt)malloc(sizeof(t));cur->c=s[i++];if(cur->c=='1'){free(cur);return
這題可以不用並查集做,可以根據樹的性質(邊數=節點數-1)來做#include<stdio.h>int vis[100010],ji[100010];int f;int root(int a){while(ji[a]!=a)a=ji[a];return a;}void bing(int a,int b){int aa,bb;aa=root(a);bb=root(b);if(aa==bb)f=1;else
/*我也沒有讀題 剛學就直接搜的這類題 找了個簡單的練習大致上好像是這麼個意思 給你一個圖 邊有上下界求無源匯最大流 沒有輸出NO 有則輸出 YES 並輸出 各邊的流量*/#include<iostream>#include<string.h>using namespace std;const int N=205;struct node{int u,v;}e[N*N];int l[N][N],u[N][N],g[N][N],d[N],num[N],
很簡單的一道題,讓我WA了n次,沒想到給的資料還可以是不安時間先後的,搞得都沒興趣了,代碼很亂,懶得改了t[i].cuo[j] 表示i同學j題的錯誤提交次數 若為-1則表示已經提交成功#include<stdio.h>#include<stdlib.h>#include<string.h>struct team{int no,time,sol,cuo[25];}t[1010];struct ti{int
/***p[i]存長度為i的上升子序列的最小末元素*可以推出p[i]中的元素師按從小到大排列的,*因為長度為i的序列中可以找到一個長度為i-1的序列,長度為i-1的序列的末元素一定比長度為i的序列的末元素小,上升子序列麼*若p[i-1]比p[i]大,則上述中的長度為i-1的序列的末元素可以更新它*若當前元素最大,則長度增加*否則找到一個他可以更新的,更新之**題意:針腳之間有一些連線,有的交叉,現在不允許交叉,求最多能留下幾根線*以某一邊為序,求一個最長上升子序列的長度即可,普通方法可能逾時,所
/*將敵人和朋友併到一個集合中,用另外一個數組(rel[i])存放i和集合代表元素(就是ji[i]中存的)的關係。如果兩個元素不在統一集合內,說明他們關係不清楚;如果兩個元素在同一個集合內:1.他們和集合代表元素的關係相同,他們則是朋友2.不同就是敵人*/#include<stdio.h>int ji[100010],rel[100010];//ji[]存放集合代表元素,re;[i]存放i和集合代表元素的關係int root(int x){int
#include<stdio.h>#include<iostream>#include<map>#include<string>using namespace std;map<string,string> a;map<string,string>::iterator it;string name,op;string num;int main(){int n,f=0;scanf("%d",&n);while(n--){
/*和一個城市兩個幫差不多,那個是只有兩個狀態,這道題成三個了找一下合并集合的時候的公式就行了本代碼中:rel[i]表示i的等級,集合根的等級是0,2級可以吃1級,1級吃0級,0級吃2級*/#include<stdio.h>int ji[50010],rel[50010];int root(int x){int t;if(x==ji[x])return x;t=ji[x];ji[x]=root(ji[x]);rel[x]=(rel[t]+rel[x])%3;return ji[x];
/***AC自動機就是給當前串找一個有後續的末端相同的串*當尋找不成功時轉向他的失敗指標處*轉向時總是拋棄掉幾個前段的字元*//*題意:給一些單詞和一個字串 求字串中單詞出現的次數和 單詞可以有重疊部分*/#include <iostream> using namespace std; const int kind = 26; struct node{ node *fail; //失敗指標 node *next[kind];
/*深搜*/#include<stdio.h>int cur,i;void fan(int j){cur^=1<<j;if((j-1)>=0)cur^=1<<(j-1);if((j+1)<20)cur^=1<<(j+1);}int dfs(int j,int step){if(step==i)//是否一番轉個次數return cur==0?1:0;if(j>=20) return
/***主要用了Pick定理:area=edge/2+in-1,證明如下:*假設整個平面是一個無窮大的鐵板;在0時間,每個格點上都有一個單位的熱量。*經過無窮長時間的傳導後,最終這些熱量將以單位密度均勻地分布在整個鐵板上。*下面我們試著求多邊形P內的熱量。*考慮多邊形的每一條線段e:它的兩個端點均在格點上,因此線段e的中點是整個平面格點的對稱中心,*因而流經該線段的熱量收支平衡(這半邊進來了多少那半邊就出去了多少),即出入該線段的熱量總和實際為0。*我們立即看到,P的熱量其實完全來自於它自身內部
#include<stdio.h>#include<string.h>char a[210],b[210],c[420],d[210][210];//忘了c應該是400+int main(){int
/*類似於圖的端點塗色問題,頂多四色,依次試試深搜,依次給每個點塗色*/#include<stdio.h>#include<string.h>int n,i,color[30];int map[30][30];int he(int j,int k)//判斷j塗k苦澀是否合適{int l;for(l=0;l<n;l++){if(map[j][l]&&color[l]==k)return 0;}return 1;}int dfs(int
#include<stdio.h>#include<string.h>int main(){int ss[30];//帶表人物狀態,0-該人不在這兒,1該人已入住,-1人滿了沒入住在這裡等待int chu,zhu,n,i;char
題意:大致就是 一串數字中刪除k個,是剩下的串中連續數字最長,輸出長度貼兩個別人的代碼,加了注釋/**/#include<iostream>#include<algorithm>#include<stdio.h>#include<string.h>#include<math.h>#include<queue>#define oo 2000000000#define ll long longusing namespace
我先用的是把中跟輸出的結果放到數組裡,然後輸出它的前面的和後面的#include<stdio.h>#include<stdlib.h>typedef struct tree{char c;struct tree *l,*r;}t,*lt;char s[10100];int i=0;lt h;lt sol()//建立二叉樹{lt
/*求一些數字中 兩兩異或 的最大值用樹吧個數字存起來(二叉樹,根據其各位來分支)某數跟它的反(~a)的異或最大,所以要從高位向低位尋找盡量滿足其反的數字,他們的異或最大*/#include<stdio.h>struct node{int l,r;__int64 a;}p[200000];int n,yong;__int64 max,a;void build(){int i=0,cur=0,zhen;for(i=31;i>=0;i--){zhen=a&1<<
/*題意:n個地點有m條路相連,從1走到n再回來,不走重複的路(這題居然認為,同一條路,按不同的方向走算是走不重複的路)最小費用最大流因為要來回,素以相當於找兩條1~n的最短路s~1 流量2 費用0n~t 流量2
#include<stdio.h>#include<stdlib.h>typedef struct tree{char c;struct tree *l,*r;}t,*lt;char s[1010];int i=0,shen,mshen;lt h;lt sol(){lt cur=(lt)malloc(sizeof(t));cur->c=s[i++];if(cur->c=='1'){free(cur);return
/*兩個日期之間相隔的天數*/#include<stdio.h>int y1,y2,m1,m2,d1,d2;int tian[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31};int from(int n,int y,int t){int f,ret=t,i=y-1;if(n%400==0||n%4==0&&n%100!=0)f=1;else f=0