首页 > 其他分享 >「杂题乱刷2」CF1486C1 & CF1486C2

「杂题乱刷2」CF1486C1 & CF1486C2

时间:2024-08-07 21:39:07浏览次数:14  
标签:tmp return ll long CF1486C2 CF1486C1 杂题 id define

题目链接

CF1486C1

CF1486C2

解题思路

提供一个比较显然的思路。

我们发现我们可以先求出整体的最小值,然后设整体最小值所在的位置为 \(id\),则我们可以通过 \(1\) 次询问 \([1,id]\) 来求出最大值的位置是在 \([1,id)\) 还是在 \((id,n]\)。然后我们就有了整体最大值在一个前缀或后缀时的情况,此时直接二分出第一个次大值位置为 \(id\) 的位置即为最大值所在的位置。

询问次数 \(1 + \log n\) 次,可以通过 C1 和 C2。

参考代码

点击查看代码
/*
Tips:

你数组开小了吗?
你MLE了吗?
你觉得是贪心,是不是该想想dp?
一个小时没调出来,是不是该考虑换题?
打 cf 不要用 umap!!!

记住,rating 是身外之物。

该冲正解时冲正解!

Problem:

算法:

思路:

*/
#include<bits/stdc++.h>
using namespace std;
//#define map unordered_map
#define re register
#define ll long long
#define forl(i,a,b) for(re ll i=a;i<=b;i++)
#define forr(i,a,b) for(re ll i=a;i>=b;i--)
#define forll(i,a,b,c) for(re ll i=a;i<=b;i+=c)
#define forrr(i,a,b,c) for(re ll i=a;i>=b;i-=c)
#define pii pair<ll,ll>
#define mid ((l+r)>>1)
#define lowbit(x) (x&-x)
#define pb push_back
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//#define endl '\n'
#define QwQ return 0;
#define db long double
#define ull unsigned long long
#define lcm(x,y) x/__gcd(x,y)*y
#define Sum(x,y) 1ll*(x+y)*(y-x+1)/2
#define x first
#define y second
#define aty cout<<"Yes\n";
#define atn cout<<"No\n";
#define cfy cout<<"YES\n";
#define cfn cout<<"NO\n";
#define xxy cout<<"yes\n";
#define xxn cout<<"no\n";
#define printcf(x) x?cout<<"YES\n":cout<<"NO\n";
#define printat(x) x?cout<<"Yes\n":cout<<"No\n";
#define printxx(x) x?cout<<"yes\n":cout<<"no\n";
#define maxqueue priority_queue<ll>
#define minqueue priority_queue<ll,vector<ll>,greater<ll>>
//ll pw(ll x,ll y,ll mod){if(x==0)return 0;ll an=1,tmp=x;while(y){if(y&1)an=(an*tmp)%mod;tmp=(tmp*tmp)%mod;y>>=1;}return an;}
void Max(ll&x,ll y){x=max(x,y);}
void Min(ll&x,ll y){x=min(x,y);}
ll _t_;
void _clear(){}
ll n;
ll id;
ll ask(ll l,ll r)
{
	if(l==r)
		return -1;
	cout<<"? "<<l<<' '<<r<<endl;
	ll z;
	cin>>z;
	return z;
}
/*
1 2 3 4 5
*/
void solve()
{
	_clear();
	cin>>n;
	id=ask(1,n);
	if(ask(1,id)==id)
	{
		ll L=1,R=id;
		while(L<R)
		{
			ll Mid=(L+R+1)/2;
			if(ask(Mid,id)==id)
				L=Mid;
			else
				R=Mid-1;
		}
		cout<<"! "<<L<<endl;
		return ;
	}
	else
	{
	//	cout<<"??? "<<id<<endl;
		ll L=id,R=n;
		while(L<R)
		{
			ll Mid=(L+R)/2;
			if(ask(id,Mid)!=id)
				L=Mid+1;
			else
				R=Mid;
		}
		cout<<"! "<<L<<endl;
		return ;		
	}
}
int main()
{
	IOS;
	_t_=1;
 //	cin>>_t_;
	while(_t_--)
		solve();
	QwQ;
}

标签:tmp,return,ll,long,CF1486C2,CF1486C1,杂题,id,define
From: https://www.cnblogs.com/wangmarui/p/18347917

相关文章

  • 【笔记】杂题选讲 2024.8.1 下午
    [AGC018F]TwoTrees[AGC018F]TwoTrees-洛谷|计算机科学教育新生态(luogu.com.cn)先判一下奇偶性。考虑做一个很强的钦定,奇数都填\(\pm1\),偶数都填\(0\)。对于同一棵树的一棵子树,考虑对子树内两个奇数点做匹配,要求匹配上的点一个\(+1\)一个\(-1\),这样就能在子树的根......
  • 24.8 杂题
    终于又开新坑,先把lsy的题单补一补。CF1304CAirConditioner我靠,1500,真不会啊。维护\([l,r]\)表示某个时刻可能的温度,用每个人的区间更新即可。CF1322CInstantNoodles真不会啊,真不会啊。显然\(\gcd(a,b)=\gcd(a,b,a+b)\),所以不交的集合就没用了。但是一些相交的集合......
  • 杂题合集
    P1437敲砖块如果我们选择了一个点那么以它为顶点的直角指向左上角的等腰直角三角形中的所有点都应该被选定。那也就是说最后的图形是若干的直角三角形框住的元素的权值和。我们考虑一列一列考虑最后的图形,发现前一列的长度小于等于当前列的长度加一,观察发现这是充要的,用这个性......
  • 「杂题乱刷2」CF1889A Qingshan Loves Strings 2
    vp到的。题目链接CF1889AQingshanLovesStrings2解题思路我们考虑从头到尾依次判断情况。维护两个指针\(l,r\)来依次比较,直到有\(a_l=a_r\)。这种情况根据题目所述是不合法的,因此我们需要依次分讨一下两种情况:\(a_l=a_r=1\),这时我们只需要在\(s_l\)前加上......
  • 「杂题乱刷2」CF1513C
    duel到的。题目链接CF1513CAddOne(luogu)CF1513CAddOne(codeforces)解题思路我们发现,初始数列中的每个数字变为\(10\)必定只需要至多\(10\)次,于是我们可以直接预处理出\(10\)这个数字经过\(i\)次变化后能形成多少位的数字即可。状态为\(dp_{i,j}\)表示\(1......
  • 【题解】Solution Set - 杂题选讲「刘君实」
    https://www.becoder.com.cn/contest/5423「HNOI2012」集合选数感觉差不多会。7/25sh杂题听课情况NOI2018冒泡排序【40】几乎不会麦田里的守望者【40】打表找规律、最后dp不太理解星空列车【40】完全不会WereYouLast:知道怎么做,但是不知道为什么是对的A......
  • 「杂题乱刷2」P3107
    题目链接P3107[USACO14OPEN]OdometerS解题思路数位dp模板。令某个数的特殊数字为在一个数字中至少出现过一半的数位的数字。首先我们可以依次拆分数位来枚举当某个数位为特殊数字时来进行数位dp,状态为\(dp_{last,len,num,sum,\_1,\_0}\)来代表还剩余\(last\)个数位......
  • 2024 暑假集训杂题选做
    目录写在前面CF1981DCF1992F写在最后写在前面我是飞物。CF1981D2400妈的好诡异的题场上拿到这题我都不知道我要干啥呃呃考虑到每个合数均为若干质数的乘积,则若构造方案中有合数,可以将合数替换为质数从而减少使用的权值的种类数,于是仅需考虑使用质数构造,则此时并不需要考虑具......
  • 「杂题乱刷2」CF1615C Menorah
    题目链接CF1615CMenorah(luogu)CF1615CMenorah(codeforces)解题思路这题有三个重要的性质:在同一个点做两次操作与不在这个点做操作是等价的。给两个不同的点做操作等价于交换这两个点。给一个字符串做偶数次操作,这个字符串的\(0\)的数量和\(1\)的数量不会改......
  • 「杂题乱刷2」CF1015D Walking Between Houses
    duel到的。题目链接CF1015DWalkingBetweenHouses解题思路一道细节题。思路很简单,肯定是一开始能走的越多越好,因此就有一种较好实现的方案,先每次走\(n-1\)格,但由于每次至少要走一格,因此如果不够走了就把能走的都走掉,之后全走\(1\)步即可。时间复杂度\(O(k)\)。参......