……node
#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define eps 1e-10 #define MAXN 500005 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) { res = 0;T f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 +c - '0'; c = getchar(); } res *= f; } template<class T> void out(T x) { if(x < 0) {x = -x;putchar('-');} if(x >= 10) { out(x / 10); } putchar('0' + x % 10); } string s; void Solve() { cin >> s; cout << s.substr(0,4) << " " << s.substr(4) << endl; } int main() { #ifdef ivorysi freopen("f1.in","r",stdin); #endif Solve(); return 0; }
……c++
#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define eps 1e-10 #define MAXN 100005 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) { res = 0;T f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 +c - '0'; c = getchar(); } res *= f; } template<class T> void out(T x) { if(x < 0) {x = -x;putchar('-');} if(x >= 10) { out(x / 10); } putchar('0' + x % 10); } int N; int a[MAXN]; void Solve() { read(N); for(int i = 1 ; i <= N ; ++i) { read(a[i]); } int ans = 0; for(int i = 1 ; i <= N ; ++i) { if(a[a[i]] == i) ++ans; } out(ans / 2);enter; } int main() { #ifdef ivorysi freopen("f1.in","r",stdin); #endif Solve(); return 0; }
先從前面到後面把能變成a的都變成a,而後把全部的操做給最後一個字母便可spa
#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define eps 1e-10 #define MAXN 100005 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) { res = 0;T f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 +c - '0'; c = getchar(); } res *= f; } template<class T> void out(T x) { if(x < 0) {x = -x;putchar('-');} if(x >= 10) { out(x / 10); } putchar('0' + x % 10); } int K,N; char s[MAXN]; void Solve() { scanf("%s",s + 1); read(K); N = strlen(s + 1); for(int i = 1 ; i <= N ; ++i) { int t = s[i] - 'a'; if(t != 0) { if(K >= 26 - t) {s[i] = 'a';K -= (26 - t);} } } K %= 26; int t = s[N] - 'a'; t = (t + K) % 26; s[N] = 'a' + t; for(int i = 1 ; i <= N ; ++i) { putchar(s[i]); } enter; } int main() { #ifdef ivorysi freopen("f1.in","r",stdin); #endif Solve(); return 0; }
\(b_{i,j} + b_{i + 1,j + 1} = b_{i,j + 1} + b_{i + 1,j}\)code
能夠獲得\(b_{i,j + 1} - b_{i,j} = b_{i + 1,j + 1} - b_{i + 1,j}\)ci
一樣的橫列也能夠獲得get
\(b_{i + 1,j} - b_{i,j} = b_{i + 1,j + 1} - b_{i,j + 1}\)string
也就是咱們能夠找到兩個數列\(x_{1}..x_{R}\)it
和\(y_{1}..y_{C}\)class
\(b_{i,j} = x_{i} + y_{j}\)sed
是知足對角線兩列相加相等的
而後咱們把\(x_{i} + y_{j}\)固定的連一條邊,一個聯通塊內固定一個即可以使得全部點都標記上值,咱們在標記的過程當中同時看是否合法便可
那麼如何保證非負呢
咱們在一個聯通塊內,若是最小的x和最小的y相加是正的,覺得一個聯通塊內y增長1會使得全部的x減小1,x增長1同理,這種狀況使得全部的x和y都變成非負的,顯然合法
若是最小的x和最小的y是負的,那麼就不合法了,也沒法調整了
#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define eps 1e-10 #define MAXN 200005 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) { res = 0;T f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 +c - '0'; c = getchar(); } res *= f; } template<class T> void out(T x) { if(x < 0) {x = -x;putchar('-');} if(x >= 10) { out(x / 10); } putchar('0' + x % 10); } int R,C,N; struct node { int to,next; int64 val; }E[MAXN * 10]; int head[MAXN],sumE; int64 val[MAXN],xmin,ymin; bool vis[MAXN]; bool used[MAXN]; void add(int u,int v,int64 c) { E[++sumE].to = v; E[sumE].next = head[u]; E[sumE].val = c; head[u] = sumE; } bool dfs(int u) { vis[u] = 1; for(int i = head[u] ; i ; i = E[i].next) { int v = E[i].to; if(!vis[v]) { val[v] = E[i].val - val[u]; if(!dfs(v)) return false; } else { if(val[u] + val[v] != E[i].val) return false; } } return true; } void find_min(int u) { used[u] = 1; if(u <= R) xmin = min(xmin,val[u]); if(u > R) ymin = min(ymin,val[u]); for(int i = head[u] ; i ; i = E[i].next) { int v = E[i].to; if(!used[v]) find_min(v); } } void Solve() { read(R);read(C);read(N); int a,b;int64 c; for(int i = 1 ; i <= N ; ++i) { read(a);read(b);read(c); add(a,b + R,c);add(b + R,a,c); } for(int i = 1 ; i <= R + C ; ++i) { if(!vis[i]) { if(!dfs(i)) {puts("No");return;} xmin = 1e18,ymin = 1e18; find_min(i); if(xmin + ymin < 0) {puts("No");return;} } } puts("Yes"); } int main() { #ifdef ivorysi freopen("f1.in","r",stdin); #endif Solve(); return 0; }
假如對一個序列進行了操做,這個序列最後的樣子是未操做的數仍然有序放在最後,而後被操做的數從後往前掃描操做序列,第一個出現的數排在最前,重複出現的直接忽略便可
那麼咱們對假如Q次放到同一序列裏,也作一遍這個操做,會獲得一個最終序列,這個序列就是咱們必須讓每個都變成這樣的序列
序列從末尾到前非單調降低的第一個位置以前,就是每一個序列都必須有的一段操做序列
因而咱們從後往前掃看看這種操做序列最可能是否超過N個便可
#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define eps 1e-10 #define MAXN 100005 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) { res = 0;T f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 +c - '0'; c = getchar(); } res *= f; } template<class T> void out(T x) { if(x < 0) {x = -x;putchar('-');} if(x >= 10) { out(x / 10); } putchar('0' + x % 10); } int N,M,Q; int a[MAXN],pos[MAXN],reserve[MAXN]; bool vis[MAXN]; vector<int> v; void Solve() { read(N);read(M);read(Q); v.pb(0); for(int i = 1 ; i <= Q ; ++i) {read(a[i]);} for(int i = Q ; i >= 1 ; --i) { if(!vis[a[i]]) { v.pb(a[i]); vis[a[i]] = 1; } } for(int i = 1 ; i <= M ; ++i) { if(!vis[i]) v.pb(i); } for(int i = 1 ; i <= M ; ++i) pos[v[i]] = i; int p = M; while(p > 1 && v[p - 1] < v[p]) --p; if(p == 1) {puts("Yes");return;} for(int i = Q ; i >= 1 ; --i) { if(a[i] == v[1]) reserve[1]++; else { if(reserve[pos[a[i]] - 1]) { reserve[pos[a[i]] - 1]--; reserve[pos[a[i]]]++; } } } int res = 0; for(int i = p - 1 ; i <= M ; ++i) { res += reserve[i]; } if(res >= N) {puts("Yes");return;} else {puts("No");return;} } int main() { #ifdef ivorysi freopen("f1.in","r",stdin); #endif Solve(); return 0; }