首页 > 其他分享 >CF div3 883

CF div3 883

时间:2023-07-08 17:22:30浏览次数:50  
标签:883 std int ll CF ++ ar div3 size

题目链接


E2

按值域分治的技巧

前置 : \(f(k , n) = 1 + k + k ^ 2 + ... + k ^ n\)
\(①\) : 假设答案最终的 \(n = 2\) , 对于 \(1 + k + k ^ 2\) , 我们在 \([2 , 10^9]\) 的范围二分 \(k\) 即可
\(②\) : 假设答案最终的 \(n > 2\) , 那么形式至少是 \(1 + k + k ^ 2 + k ^ 3\) , 由于 \(k ^ 3\) 的存在 , \(k\)的范围只能是 \([2 , 10^6]\) , 那么我们枚举 \(k\) , 对于每种 \(k\) , 递增枚举 \(n\) , 不断向 \(set\) 添加\(f(k , n)\) 的值 , 知道\(f(k , n) > 10^{18}\) , 由于指数增加 , 最终 \(set\) 中的个数为\(O(klogk) , k = 10^6\)

对于每个 \(x\) , 先尝试 \(①\) , 再尝试 \(②\) 即可

#include <bits/stdc++.h>
using ll = long long;
const ll INF = 1E18;

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	
	std::set<ll> p;
	for(ll k = 2 ; k <= 1E6 ; ++k) {
		
		ll w = 1 + k + k * k + k * k * k;
		p.insert(w);
		
		ll base = k * k * k;
		while(true) {
			
			if (base <= INF / k) {
				base *= k;
			} 
			else break;

			if (w + base <= INF) {
				w += base;
				p.insert(w);
			}
			else break;
		}
	}
	
	int t;
	std::cin >> t;
	while (t--) {
		
		ll x ;
		std::cin >> x;
		
		ll l = 2 , r = 1E9;
		while(l < r) {
			ll mid = l + r >> 1;
			if(1 + mid + mid * mid >= x) r = mid;
			else l = mid + 1;
		}	
		
		bool ok = false;
		
		if(1 + r + r * r == x) {
			ok = true;
		} 
		if(!ok && p.count(x)) {
			ok = true;
		}
		
		if(ok) std::cout << "YES\n";
		else std::cout << "NO\n";
		
	}
	
	return 0;	
} 

F

策略 :

$① : $ 先尝试不删除(1次 或 2次) , 那么特殊物品的颜色对应个数会加一
$② : $ 将当前序列中不是这个颜色的删除
$③ : $ 如果特殊物品在 \(②\) 中变色 , 则找到位置 , 否则在尝试一次不删除 , 它必定变色

注意 : \(std::endl\) 可以直接刷新缓存区

#include <bits/stdc++.h>
using ll = long long;

void solve()
{
	int n;
	std::cin >> n;
	
	std::vector<int> ar,Empty;
	std::vector<int> cnt1(10 , 0) , cnt2(10 , 0);
	for(int i = 0 ; i < n ; ++i) {
		int x ; std::cin >> x;
		cnt1[x] += 1;
	}
	
	auto query = [&](int n , std::vector<int> &q) {
		
		std::cout << '-' << ' ' << q.size() ; 
		for(auto x : q) {
			std::cout << ' ' << x + 1; 
		}
		std::cout << std::endl;
				
		std::vector<int> a(n - q.size());
		for(int i = 0 ; i < n - q.size() ; ++i)
			std::cin >> a[i];
		return a;
		
	};
	
	ar = query(n , Empty);
	for(int i = 0 ; i < ar.size() ; ++i) 
		cnt2[ar[i]] += 1;
		
	int col = 0;
	for(int i = 1 ; i <= 9 ; ++i) {
		if(cnt2[i] == cnt1[i] + 1) {
			col = i ; break;
		}
	}
	
	if(col == 0) {
		ar = query(n , Empty);
		fill(cnt2.begin(),cnt2.end(),0);
		for(int i = 0 ; i < ar.size() ; ++i)
			cnt2[ar[i]]++;
		for(int i = 1 ; i <= 9 ; ++i) {
			if(cnt2[i] == cnt1[i] + 1) {
				col = i ; break;
			}
		}
	}
	
	std::vector<int> del;
	for(int i = 0 ; i < ar.size() ; ++i) {
		if (ar[i] != col) {
			del.push_back(i);
		}
	}
	
	ar = query(ar.size() , del);
	
	int ans = 0;
	for(int i = 0 ; i < ar.size() ; ++i) {
		if(ar[i] != col) {
			ans = i + 1 ; break;
		}
	}
	
	if(ans == 0) {
		ar = query(ar.size() , Empty);
		for(int i = 0 ; i < ar.size() ; ++i) {
			if(ar[i] != col) {
				ans = i + 1 ; break;
			}
		}
	} 
	
	std::cout << "! " << ans << std::endl;
		
}
int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	
	int t;
	std::cin >> t;
	while (t--) {
		solve();
	}
	
	return 0;
}

标签:883,std,int,ll,CF,++,ar,div3,size
From: https://www.cnblogs.com/xqy2003/p/17537517.html

相关文章

  • CF500C New Year Book Reading 题解
    这一题是一道比较复杂的贪心(对于本蒟蒻来说)假如两本书\(a\)和\(b\),先看\(a\)再看\(b\),那么我们开始的时候就把\(a\)放在上面。这样的话,我们看\(a\)时就不需要搬动\(b\),看\(b\)的时候会搬动\(a\)。而一开始如果把放在上面,看\(a\)的时候需要搬动\(b\),看\(b\)......
  • CF1817E Half-sum
    greedy把数分成两个集合\(A,B\),且\(A<B\)。令每个集合的数的个数分别是\(a,b\)。令\(A_1\dotsA_a,B_1\dotsB_b\)分别有序。定理\(1\)\(A\)集合合并的顺序一定是从大往小的,\(B\)集合是从小往大的。应该很好猜到,但是证明需要一点推导。大概可以局部到\(x,y,z,w\)......
  • CF1842E Tenzing and Triangle - 线段树优化 dp -
    题目链接:https://codeforces.com/contest/1842/problem/E题解:首先,如果两个等腰三角形相交了,那答案肯定不会更优。因此不会相交。先考虑一个\(n^2\)的dp:设\(dp_i\)表示考虑到\(x=i\)时的最小代价,首先可以先都加一个\(\sumc_i\),这样只需要考虑三角形覆盖范围内的\(c_i......
  • hackone-cft
    一、ModerateHackyholidaysCTFWeb12访问没有任何信息,只有一段动态视频和图片。1、flag1:访问/robots.txt,得到第一个flag ^FLAG^a5e751ad462e41a83378eabef4d7fa25a6aed78ed8af73fa62355a4b231ef800$FLAG$ 2、flag2:在robots.txt页面发现“Disallow:/s3cr3t-ar3a”......
  • CF1451F 题解
    problem&blog。这题原本的题解满是废话,让我写一篇(这边直接给结论了。令\(val_p=\oplus_{x+y=p}\a_{x,y}\),设\(S=\Big[\normalsize\forallval_i=0\Big]\),当\(S=\text{true}\)时,后手必胜;否则先手必胜。证明也是典中典。证两个条件即可。证明\(\forallS\Rightarr......
  • cfssl 自签证书
    cfssl1**.1准备cfssl证书生成工具**cfssl是一个开源的证书管理工具,使用json文件生成证书,相比openssl更方便使用。找任意一台服务器操作,这里用Master节点。wgethttps://pkg.cfssl.org/R1.2/cfssl_linux-amd64wgethttps://pkg.cfssl.org/R1.2/cfssljson_linux-amd64wgetht......
  • Z CF 板刷记录
    七点半的灯火,人潮将我吞没,连同我小小的歌。CF1783E难点在读题,一句话题意是对于两个元素大小在\(n\)以内的序列\(a,b\),找到所有的\(k\)能够满足\(\foralli\in[1,n],\lfloor\frac{a_i}{k}\rfloor\leq\lfloor\frac{b_i}{k}\rfloor\)。假设我们已经对于每一对......
  • CF13E Holes
    建立一个虚拟点\(p\),满足\(p\)在LCT中编号最小。如果一个点\(i\)可以弹到点\(j\)那么\(i\)到\(j\)连一条边。如果一个点\(i\)可以被弹出那么向\(p\)连一条边。然后,直接用LCT即可。\(0\)操作直接修改即可。\(1\)操作最后落在哪一个洞就是编号区间最大值,......
  • cncf毕业的项目有哪些
    CNCF(CloudNativeComputingFoundation)是一个致力于推动云原生计算的非营利组织,旨在构建可移植、可扩展和可维护的应用程序。CNCF维护了许多开源项目,其中一些已经毕业并成为成熟的项目。以下是一些通过CNCF毕业认证的知名项目:Kubernetes:Kubernetes是一个用于自动化部署、扩展......
  • CF1805D A Wide, Wide Graph
    也许更好的阅读体验\(\mathcal{Description}\)给你一棵有\(n\)个结点的树,定义\(G_k\)为将在原树中所有距离大于等于\(k\)的点对间连一条无向边所构成的无向图(距离定义为简单路径中边的数量)。对于所有\(1\lek\len\),求\(G_k\)​中连通块的数量。\(2\len\le10^5\)......