1. 程式人生 > >ZOJ Monthly, March 2018 題解

ZOJ Monthly, March 2018 題解

題目連結

首先肯定是選擇值最小的 $2*m$ 進行操作,這些數在操作的時候每次取一個最大的和最小的相乘是最優的。

#include <bits/stdc++.h>
using namespace std;

const int maxn = 100010;
int T, n, m;
long long a[maxn];

int main() {
  scanf("%d", &T);
  while(T--) {
    scanf("%d%d", &n, &m);
    long long sum = 0;
    for(int i = 0; i < n; i ++) {
      scanf("%lld", &a[i]);
    }
    sort(a, a+n);
    
    int first = 0, last = m * 2 - 1;
    while(first < m) {
      sum = sum + a[first] * a[last];
      first++;
      last--;
    }
    printf("%lld\n", sum);
  }
  return 0;
}

找規律會發現就是求 $\left\lfloor \sqrt { n }  \right\rfloor $ 的奇偶性。從這裡學大數開根號。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int l;char ans[1000];int num=0;
int work(int o,char *O,int I)
{
  char c,*D=O;
  if(o>0)
  {
    for(l=0;D[l];D[l++]-=10)
    {
      D[l++]-=120;
      D[l]-=110;
      while(!work(0,O,l))
        D[l]+=20;
      //putchar((D[l]+1032)/20);
      ans[num++]=(D[l]+1032)/20;
    }
    //putchar(10);
    //ans[num++]='1';ans[num++]='0';
  }
  else
  {
    c=o+(D[I]+82)%10-(I>l/2)*(D[I-l+I]+72)/10-9;
    D[I]+=I<0 ? 0 : !(o=work(c/10,O,I-1))*((c+999)%10-(D[I]+92)%10);
  }
  return o;
}

int main()
{
  char s[1200];
  int t;scanf("%d",&t);
  while(t--){
    num=0;
    s[0]='0';
    scanf("%s",s+1);
    if(strlen(s)%2 == 1)
      work(2,s+1,0);
    else
      work(2,s,0);
    ans[num]='\0';
    int tmp=ans[num-1]-'0';
    if(tmp&1) printf("1\n");
    else printf("0\n");
  }
  return 0;
}

假設往左走了 $x$ 步,停留了 $y$ 步,往右走了 $z$ 步,這種情況下的概率為 ${ C }_{ n }^{ x }{ C }_{ n-x }^{ y }{ \left( \frac { 1 }{ 4 }  \right)  }^{ x+z }{ \left( \frac { 1 }{ 2 }  \right)  }^{ y }$。列舉 $x$ 之後,$y$ 和 $z$ 都能確定。

#include <bits/stdc++.h>
using namespace std;

const int maxn = 6e5 + 10;
const int INF = 0x7FFFFFFF;
const long long mod = 1e9 + 7;

int T, n, m;
long long f[maxn], po[maxn];

long long extend_gcd(long long a,long long b,long long &x,long long &y) {
	if(a==0&&b==0) return -1;//無最大公約數
	if(b==0){x=1;y=0;return a;}
	long long d=extend_gcd(b,a%b,y,x);
	y-=a/b*x;
	return d;
}

long long mod_reverse(long long a,long long n) {
	long long x,y;
	long long d=extend_gcd(a,n,x,y);
	if(d==1) return (x%n+n)%n;
	else return -1;
}

long long C(int a, int b) {
	long long fz = f[a];
	long long fm = f[a - b] * f[b] % mod;
	return fz * mod_reverse(fm, mod) % mod;
}

void init() {
	po[0] = 1LL;
	f[0] = 1LL;
	for(int i = 1; i < maxn; i ++) {
		po[i] = (po[i - 1] * 2LL) % mod;
		f[i] = (f[i - 1] * i) % mod;
	}
}

int main() {
#ifdef ZHOUZHENTAO
	freopen("test.in", "r", stdin);
#endif

	init();
	scanf("%d", &T);
	while(T --) {
		scanf("%d%d", &n, &m);

		long long ans = 0;
		for(int x = 0; x <= n; x ++) {
			int y = n - x - m - x;
			int z = m + x;
			if(y < 0 || y > n) continue;
			if(z < 0 || z > n) continue;
			long long fz = C(n, x) * C(n - x, y) % mod;
			long long fm = po[2 * (x + z) + y];
			long long tmp = fz * mod_reverse(fm ,mod) % mod;
			ans = (ans + tmp) % mod;
		}

		printf("%lld\n", ans);
	}

	return 0;
}

由於每一個節點的 $x_i$ 都相同,因此 $w_{ij}$ 均為 1。總的來說就是讓你安排每個節點的權值,如果某條邊兩端點權值不同,$value$ 就加 1,問 $value$ 的最小值是多少。

將樹有根化後進行 dp,$f[i][j]$ 表示 $i$ 節點的權值設定為 $j$,以 $i$ 為根的子樹的最小 $value$ 值。

#include <bits/stdc++.h>
using namespace std;

const int maxn = 2e5 + 10;
const int INF = 0x7FFFFFFF;

int h[maxn], to[maxn], nx[maxn], sz;
int y[maxn];
int T, n;
int dp[maxn][2], f[maxn];

void add(int x, int y) {
	to[sz] = y;
	nx[sz] = h[x];
	h[x] = sz ++;
}

void dfs(int x) {
	f[x] = 1;
	if(y[x] == -1) dp[x][0] = dp[x][1] = 0;
	else dp[x][y[x]] = 0;	
	for(int i = h[x]; i != -1; i = nx[i]) {
		if(f[to[i]]) continue;
		dfs(to[i]);
		if(y[x] != -1) {
			dp[x][y[x]] += min(dp[to[i]][y[x]], dp[to[i]][y[x] ^ 1] + 1); 
		} else {
			dp[x][0] += min(dp[to[i]][0], dp[to[i]][1] + 1);
			dp[x][1] += min(dp[to[i]][0] + 1, dp[to[i]][1]);
		}
	}
}

int main() {
#ifdef ZHOUZHENTAO
	freopen("test.in", "r", stdin);
#endif

	int T;
	scanf("%d", &T);
	while(T --) {
		scanf("%d", &n);
		for(int i = 1; i <= n; i ++) {
			scanf("%d", &y[i]);
			h[i] = -1;
			dp[i][0] = dp[i][1] = 5000000;
			f[i] = 0;
		}
		sz = 0;
		for(int i = 1; i < n; i ++) {
			int x, y;
			scanf("%d%d", &x, &y);
			add(x, y);
			add(y, x);
		}	
		dfs(1);
		for(int i = 1; i <= n; i ++) {
			//  cout << i << " " << dp[i][0] << " " << dp[i][1]<< endl;
		}
		printf("%d\n", min(dp[1][0], dp[1][1]));
	}


	return 0;
}

樹上詢問編號在 $[L,R]$ 範圍的節點和邊構成了幾個連通塊。首先 $[L, R]$ 有 $R-L+1$ 個節點,如果我們能夠計算出來 $[L, R]$ 有 $x$ 條邊,那麼答案就是 $R-L+1-x$。由於是樹,多一條邊就會少一個連通塊。

計算 $[L, R]$ 中的邊的條數就成了一個區間問題。題目中給出的邊相當於 $n-1$ 個區間,問這些區間中有多少區間完全在 $[L,R]$ 內。

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;
const int INF = 0x7FFFFFFF;

int T, n, q;
struct X {
	int L, R, tp, id;
}s[maxn * 4];

int ans[maxn * 4];
int c[maxn * 4];

int lowbit(int x) {
	return x & (-x);
}

int sum(int p) {
	int res = 0;
	while(p > 0) {
		res += c[p];
		p -= lowbit(p);
	}
	return res;
}

void update(int p) {
	while(p < 4 * maxn) {
		c[p] += 1;
		p += lowbit(p);
	}
}

bool cmp(const X& a, const X& b) {
	if(a.R != b.R) {
		return a.R < b.R;
	} else {
	  return a.tp < b.tp;
	}
}

int main() {
#ifdef ZHOUZHENTAO
	freopen("test.in", "r", stdin);
#endif

	scanf("%d", &T);
	while(T--) {
		scanf("%d%d", &n, &q);
		for(int i = 1; i < n + q; i ++) {
			scanf("%d%d", &s[i].L, &s[i].R);
			if(s[i].L > s[i].R) {
				swap(s[i].L, s[i].R);
			}
			if(i < n) s[i].tp = 0;
			else s[i].tp = 1;
			s[i].id = i;
		}
		int u = 0;
		sort(s + 1, s + n + q, cmp);

		for(int i = 1; i < n + q; i ++) {
			//		cout << s[i].L << " " << s[i].R << " " << s[i].tp << " " << s[i].id << endl;;
		}

		memset(c, 0, sizeof c);
		for(int i = 1; i < n + q; i ++) {
			if(s[i].tp == 0) {
				u ++;
				update(s[i].L);
			} else {
				ans[s[i].id] = (s[i].R - s[i].L + 1) - (u - sum(s[i].L - 1));
			}
		}

		for(int i = n; i < n + q; i ++) {
			printf("%d\n", ans[i]);
		}
	}


	return 0;
}

所有資料在變 48 次之後,就會變回一開始的數,因此迴圈節為 48,線段樹每個節點存 48 種狀態即可。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

const int mod = 99971;
const int maxn = 1e5 + 10;

int T, n, q;
int s[maxn * 4][50];
int f[maxn * 4], p[maxn * 4];
int nx[maxn];

void init() {
  for(int i = 0; i < 99971; i ++) {
    nx[i] = 1;
    for(int j = 0; j < 3; j ++) {
      long long tmp = (1LL * nx[i] * 1LL * i) % (long long)mod;
      nx[i] = (int)tmp;
    }
  }
}

void pushUp(int rt) {
  for(int i = 0; i < 48; i ++) {
    s[rt][i] = (s[2 * rt][(p[2 * rt] + i) % 48]
                + s[2 * rt + 1][(p[2 * rt + 1] + i) % 48]) % mod;
  }
  p[rt] = 0;
}

void pushDown(int rt) {
  if(f[rt] == 0) return;
  f[2 * rt] += f[rt];
  f[2 * rt + 1] += f[rt];
  p[2 * rt] = (p[2 * rt] + f[rt]) % 48;
  p[2 * rt + 1] = (p[2 * rt + 1] + f[rt]) % 48;
  f[rt] = 0;
}

void build(int l, int r, int rt) {
  p[rt] = f[rt] = 0;
  if(l == r) {
    scanf("%d", &s[rt][0]);
    s[rt][0] = s[rt][0] % mod;
    for(int i = 1; i < 48; i ++) {
      s[rt][i] = nx[s[rt][i - 1]];
    }
    return;
  }
  int mid = (l + r) / 2;
  build(l, mid, 2 * rt);
  build(mid + 1, r, 2 * rt + 1);
  pushUp(rt);
}

void update(int L, int R, int l, int r, int rt) {
  if(L <= l && r <= R) {
    p[rt] = (p[rt] + 1) % 48;
    f[rt] = f[rt] + 1;
    return;
  }
  pushDown(rt);
  int mid = (l + r) / 2;
  if(L <= mid) update(L, R, l, mid, 2 * rt);
  if(R > mid) update(L, R, mid + 1, r, 2 * rt + 1);
  pushUp(rt);
}

int sum(int L, int R, int l, int r, int rt) {
  if(L <= l && r <= R) {
    return s[rt][p[rt]];
  }
  int left = 0;
  int right = 0;
  pushDown(rt);
  int mid = (l + r) / 2;
  if(L <= mid) left = sum(L, R, l, mid, 2 * rt);
  if(R > mid) right = sum(L, R, mid + 1, r, 2 * rt + 1);
  pushUp(rt);
  return (left + right) % mod;
}


int main() {
  init();
  scanf("%d", &T);
  while(T --) {
    scanf("%d%d", &n, &q);
    build(1, n, 1);
    while(q --) {
      int op, L, R;
      scanf("%d%d%d", &op, &L, &R);
      if(op == 1) {
        update(L, R, 1, n, 1);
      } else {
        printf("%d\n", sum(L, R, 1, n, 1));
      }
    }
  }
  return 0;
}

刪除連續 $k$ 個字元,相當於留下連續的 $p=len-k$ 個字元,我們可以從留下來的角度來考慮問題。

先把環拆了,也就是字串擴大一倍,這樣環上一段連續的區間就對應於字串上一段連續的區間;同樣的地,字串上一段連續的區間也對應於環上一段連續的區間。

然後要去看是否存在長度為 $p(1\le p\le len)$ 的子串,相鄰和首尾的字元均不同。

接下來感覺是本題精髓:

假設位置 1 最右能擴充套件到位置 $a$,保證 $[1,a]$ 相鄰字元都不相同(首尾先不管)

假設位置 $a+1$ 最右能擴充套件到位置 $b$,保證 $[a+1,b]$ 相鄰字元都不相同(首尾先不管)

假設位置 $b+1$ 最右能擴充套件到位置 $c$,保證 $[b+1,c]$ 相鄰字元都不相同(首尾先不管)

....

假設位置 $x+1$ 最右能擴充套件到位置 $len$,保證 $[x+1,len]$ 相鄰字元都不相同(首尾先不管)

我們把 "長度為 $p(1\le p\le len)$ 的子串,相鄰和首尾的字元均不同" 的子串稱為我們需要尋找的串。

那麼,我們需要尋找的串要麼沒有,要麼必然出現在 $[1,a]$,$[a+1,b]$,....,$[x+1,len]$ 其中的一個或多箇中。

為什麼不用考慮 $[2, ?]$,因為 ?最大也只有 $a$,所以考慮 $[1,a]$ 足夠了。

下面以 $[1,a]$ 為例,之後的都是一樣的操作。

要在 $[1,a]$ 中尋找是否存在長度為 $p$ 的我們需要尋找的串。首先,$[1,a]$ 中任意一個長度為 $p$ 的子串,相鄰都是不同的,我們只需判斷首尾。

也就是如果滿足以下其中的一項,我們就找到了長度為 $p$ 的我們需要找的串。

$s[1]\neq s[p]\\ s[2]\neq s[p+1]\\ s[3]\neq s[p+2]\\ ...\\ s[a-p+1]\neq s[a]$

觀察一下可以發現,不等式左邊形成了一個字首,右邊是一個字尾,也就是說如果字首不等於字尾,就有滿足條件的,因此字串 hash 判斷一下前後綴是否相同即可。

複雜度的話是 $O(n)$;因為 $[1,a]$,$[a+1,b]$,....,$[x+1,len]$ 這些區間無相交部分,每個區間內列舉一遍,所以複雜度是線性的。

#include <bits/stdc++.h>
using namespace std;

const int maxn = 2e6 + 10;
const int INF = 0x7FFFFFFF;

char s[maxn];
int ans[maxn];
long long base = 131;
long long mod = 1e9 + 7;
long long h[maxn], po[maxn];

long long H(int L, int R) {
	L ++; R ++;
	long long res = 0;
	long long tmp = h[L - 1] * po[R - L + 1] % mod;
	res = (h[R] - tmp + mod) % mod;
	return res;
}

int main() {
#ifdef ZHOUZHENTAO
  freopen("test.in", "r", stdin);
#endif

	po[0] = 1LL;
	for(int i = 1; i < maxn; i ++) {
		po[i] = (po[i - 1] * base) % mod;
	}

	int T;
	scanf("%d", &T);
	while(T --) {
	  scanf("%s", s);
		int len = strlen(s);
		for(int i = len; i < 2 * len; i ++) {
		  s[i] = s[i - len];
			s[i + 1] = 0;
		}
		len = 2 * len;

		for(int i = 0; i < len; i ++) {
			h[i + 1] = h[i] * base % mod;
			h[i + 1] = (h[i + 1] + s[i]) % mod;
		}
			
		//printf("%s\n", s);
		for(int i = 0; i <= len; i ++) {
			ans[i] = 0;
		}

		for(int i = 0, j = 0; i < len; i = j + 1) {
			for(j = i; j < len && j + 1 < len && s[j] != s[j + 1]; j ++) {}
			//cout << i << " " << j << endl;
			int t = j - i + 1;
			t = min(t, len / 2);
			for(int x = 1; x <= t; x ++) {
			  if(x == 1) {
					ans[x] = 1;
				} else if(H(i, j - x + 1) != H(i + x - 1, j)) {
					ans[x] = 1;
				}
			}
		}

		for(int i = len / 2; i >= 1; i --) {
		  printf("%d", ans[i]);
		}
		printf("\n");
	}
	return 0;
}

$f[i][j]$ 表示放了 $i$ 個數,最後一個數是 $j$ 的方案數。轉移的時候列舉一下約數就可以了。

#include <bits/stdc++.h>
using namespace std;

const long long mod = 1e9 + 7;
int T, n, m;
long long dp[2010][2010];
vector<int> vec[2010];

int main() {
  
  for(int i = 1; i <= 2000; i++) {
    for(int j = 1; j <= i; j ++) {
      if(i % j == 0) {
        vec[i].push_back(j);
      }
    }
  }
  
  scanf("%d", &T);
  while(T --) {
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i ++) {
      dp[1][i] = 1;
    }
    
    for(int i = 2; i <= m; i ++) {
      for(int j = 1; j <= n; j ++) {
        dp[i][j] = 0;
        for(int k = 0; k < vec[j].size(); k ++) {
          dp[i][j] = (dp[i][j] + dp[i - 1][vec[j][k]]) % mod;
        }
      }
    }
    
    long long ans = 0;
    for(int j = 1; j <= n; j ++) {
      ans = (ans + dp[m][j]) % mod;
    }
    printf("%lld\n", ans);
    
  }
  return 0;
}

用 KD-Tree 切割一下平面,每個節點算一下包圍住這個平面的最小矩形座標,每次詢問的時候如果發現這條線和這個矩形無相交部分,直接 return。

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;
const int INF = 0x7FFFFFFF;
const int demension = 2;//二維

struct node {
	int pos[demension];
	int l, r;
	int mi[2], ma[2];
}a[maxn];
int cmpDem;
int root;

int n, q, ans, A, B;

bool cmp(const node &a, const node&b) {
	return a.pos[cmpDem] < b.pos[cmpDem];
}

void Merge(int k) {
	for (int i = 0; i < demension; i++) {
		a[k].ma[i] = a[k].pos[i];
		a[k].mi[i] = a[k].pos[i];
		if (a[k].l) {
			a[k].ma[i] = max(a[k].ma[i], a[a[k].l].ma[i]);
			a[k].mi[i] = min(a[k].mi[i], a[a[k].l].mi[i]);
		}
		if (a[k].r) {
			a[k].ma[i] = max(a[k].ma[i], a[a[k].r].ma[i]);
			a[k].mi[i] = min(a[k].mi[i], a[a[k].r].mi[i]);
		}
	}
}

int build(int l, int r, int k) {
	if (l > r) return 0;
	int mid = (l + r) / 2;
	//以第mid個元素為中心排序
	cmpDem = k;
	nth_element(a + l, a + mid, a + r + 1, cmp);
	//左右子樹
	a[mid].l = build(l, mid - 1, (k + 1) % demension);
	a[mid].r = build(mid + 1, r, (k + 1) % demension);
	Merge(mid);
	return mid;
}

int G(int x1, int y1, int x2, int y2, int x3, int y3) {
	if(1LL * (x2 - x1) * (y3 - y2) == 1LL * (x3 - x2) * (y2 - y1)) return 1;
	return 0;
}

int ok(int id) {
	int x1 = A, x2 = 0, x3 = a[id].pos[0];
	int y1 = 0, y2 = B, y3 = a[id].pos[1];
	return G(x1, y1, x2, y2, x3, y3);
}

struct Point   {  
	long long x;  
	long long y;
	Point(int xx, int yy) {
		x = 1LL * xx;
		y = 1LL * yy;
	}
};  

bool lineIntersectSide(Point A, Point B, Point C, Point D) {  
	// A(x1, y1), B(x2, y2)的直線方程為:  
	// f(x, y) =  (y - y1) * (x1 - x2) - (x - x1) * (y1 - y2) = 0  

	long long fC = (C.y - A.y) * (A.x - B.x) - (C.x - A.x) * (A.y - B.y);  
	long long fD = (D.y - A.y) * (A.x - B.x) - (D.x - A.x) * (A.y - B.y);  

	if(fC > 0 && fD > 0) return false;  
	if(fC < 0 && fD < 0) return false;
	return true;  
} 

bool sideIntersectSide(Point A, Point B, Point C, Point D) {  
	if(!lineIntersectSide(A, B, C, D))  
		return false;  
	if(!lineIntersectSide(C, D, A, B))  
		return false;  
	return true;  
}  

int check(int id) {
	// [mi[0], mi[1]], [ma[0], ma[1]]
	// [A, 0], [0, B]
	if(G(A, 0, 0, B, a[id].mi[0], a[id].mi[1])) return 1;
	if(G(A, 0, 0, B, a[id].ma[0], a[id].ma[1])) return 1;
	if(sideIntersectSide(Point(A, 0), Point(0, B), Point(a[id].mi[0], a[id].mi[1]), Point(a[id].ma[0], a[id].ma[1]))) {
		return 1;
	}
	return 0;
}

void ask(int l, int r, int id) {
	if(id == 0) return;
	if(check(id) == 0) return;
	ans = ans + ok(id);
	int mid = (l + r) / 2;
	ask(l, mid - 1, a[id].l);
	ask(mid + 1, r, a[id].r);
}

int main() {
#ifdef ZHOUZHENTAO
	freopen("test.in", "r", stdin);
#endif

	int T;
	scanf("%d", &T);
	while(T --) {
		scanf("%d%d", &n, &q);
		for(int i = 1; i <= n; i ++) {
			scanf("%d%d", &a[i].pos[0], &a[i].pos[1]);
		}
		root = build(1, n, 0);
	/*	
		for(int i = 1; i <= n; i ++) {
		  printf("%d : %d %d mi[0]:%d mi[1]:%d ma[0]:%d ma[1]:%d\n", i, a[i].pos[0], a[i].pos[1], a[i].mi[0], a[i].mi[1], a[i].ma[0], a[i].ma[1]);
		}
		*/
		while(q --) {
			scanf("%d%d", &A, &B);
			ans = 0;
			ask(1, n, root);
			printf("%d\n", ans);
		}
	}

	return 0;
}

這個題比較簡單,有很多方法判吧。

#include <bits/stdc++.h>
using namespace std;

int T, n;


int main() {
  scanf("%d", &T);
  while(T--) {
    scanf("%d", &n);
    set<int> st;
    for(int i = 1; i <= n; i ++) {
      int x;
      scanf("%d", &x);
      st.insert(x);
    }
    
    int ans;
    for(int i = 1; i <= n; i ++) {
      int x;
      scanf("%d", &x);
      if(st.count(x) > 0) ans = x;
    }
    printf("%d\n", ans);
  }
  return 0;
}

相關推薦

ZOJ Monthly, March 2018 題解

【題目連結】 首先肯定是選擇值最小的 $2*m$ 進行操作,這些數在操作的時候每次取一個最大的和最小的相乘是最優的。 #include <bits/stdc++.h> using namespace std; const int maxn = 100010; int

ZOJ Monthly, March 2018

about frame cat sort exactly mov divide take mit Easy Number GameTime Limit: 2 Seconds Memory Limit: 65536 KB The bored BaoBao is pl

ZOJ Monthly, March 2018 Solution

ger tip color lse 兩種 solution $2 scan bbf A - Easy Number Game 水。 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #def

ZOJ Monthly, January 2018 總結。

刷了一下也沒有時間補題,看了別人的題解,就總結一下: A:水題。 B: 給定n字串,每次詢問查詢兩個字串的一個公共字尾,使得這個公共字尾在n個字串中至少有一個字串S,使得這個公共字尾是S的字首。問滿足條件的最長公共字尾 F,這個字尾F是一個字串的字首的話就+

135 - ZOJ Monthly, August 2014

pac ria count inf int 代碼 最大值 color push 135 - ZOJ Monthly, August 2014 A:構造問題,推斷序列奇偶性。非常easy發現最小值不是1就是0。最大值不是n就是n - 1,註意細節去構造就可以 E:d

ZOJ Monthly, November 2012

最長 有向圖 ret rim n! 利用 strong empty 最小 A.ZOJ 3666 Alice and Bob 組合博弈,SG函數應用 #include<vector> #include<cstdio> #include<c

PKUSC 2018 題解

PKUSC 2018 題解 Day 1 T1 真實排名 Link Solution 考慮對於每一個人單獨算 每一個人有兩種情況,翻倍和不翻倍,他的名次不變等價於大於等於他的人數不變 設當前考慮的人的成績為 \(v\) 翻倍的話,要求成績在 \([v, 2v-1]\) 的人全部翻倍,剩下的隨便

Web Developer Monthly 💻🚀 September 2018 – Andrei Neagoie – Medium

Web Developer Monthly 💻🚀 September 20183rd issue! If you missed the last two months check them out here and here.If it’s your first time here…Be

The State of Ethereum Scaling, March 2018

This was probably my favorite talk, primarily due to Karl’s energy and enthusiasm about the concepts he described. At the moment, Plasma is designed for si

ICOs starting March 2018

ICOs starting March 2018Written by: Lukas Schor of The Argon GroupIt is getting increasingly difficult to keep up with all the ICO’s taking place. That is

Crypto / Blockchain Events in March 2018

Crypto / Blockchain Events in March 2018Written by: Lukas Schor of The Argon GroupIt is getting increasingly difficult to keep up with all the crypto and b

Good Bye 2018題解

Good Bye 2018題解 題解 CF1091A 【New Year and the Christmas Ornament】 打完cf都忘記寫題解了qwq 題意就是:給你一些黃,藍,紅的球,滿足藍的數量恰比黃的多一,紅的數量恰比藍的多一 容易發現黃的數量恰是\(\min{y,b-1,r-2}\)

ZOJ Monthly, January 2019

編碼 當前 hash 兩種 定義 有關 res fin code A: Little Sub and Pascal‘s Triangle Solved. 題意:求楊輝三角第n行奇數個數 思路:薛聚聚說找規律,16說Lucas 1 #include<bits/

ZOJ Monthly, January 2019 Little Sub and Isomorphism Sequences 【離線離散化 + set + multiset】

插入 tdi -- for each input clear pre cati when 傳送門:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5868 Little Sub and Isomorphi

ZOJ - 4011 Happy Sequence【dp】 2018 ZOJ march月賽

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4011 題意:t個樣例 一個n 代表給你1 2 3 .。。。n的序列    一個m 問你組成長度為m的序列有多少個 關於長度為m  他是這樣定

【EOJ Monthly 2018.12 - A,B,C】套題訓練,部分題解

A. 題幹: A. 仰望星空 單測試點時限: 2.0 秒 記憶體限制: 512 MB 你就這樣靜坐在草地上,離我稍遠的地方。 我用眼角瞅著你,你什麼話也別說。 語言是誤會的根源。 但是,每天,你可以坐得離我近一些…… 你和她一起仰頭仰望著佈滿星辰的天空

4011 Happy Sequence【dp】 2018 ZOJ march月賽

題意:t個樣例 一個n 代表給你1 2 3 .。。。n的序列    一個m 問你組成長度為m的序列有多少個 關於長度為m  他是這樣定義:【這裡面有m個數】且每兩個相鄰的數  前者能整除後者  即後者%前者==0   比如n=5 m=3 有16個 111  222  3

ZOJ - 3781 Paint the Grid Reloaded 題解

amp col ont clu oid for std 所有 cnblogs 題目大意:   給一個n*m的X O構成的格子,對一個點操作可以使與它相連通的所有一樣顏色的格子翻轉顏色(X—>O或O—>X),問給定的矩陣最少操作多少次可以全部變成一樣的顏色。 思路

EOJ Monthly 2018.1 F 最小OR路徑

異或和 lua 添加 name -m eof fin ++ ble 題目鏈接 Description 給定一個有 \(n\) 個點和 \(m\) 條邊的無向圖,其中每一條邊 \(e_i\) 都有一個權值記為 \(w_i\) 。 對於給出的兩個點 \(a\) 和 \(b\)

2018年全國多校算法寒假訓練營練習比賽(第三場)題解

排序 esp 註意 test sca big %d question long long 【題目連接】 由於在比賽期間發現了很多是原題,所以直接抄了原題代碼,稍後準備重寫。 A - 不凡的夫夫 答案為$\left\lfloor {\sum\limits_