签到。我们贪心的想,让此时的重量为第一个人的的重量 w 1 w_1 w1,若在 2 − n 2-n 2−n中存在某个人的重量大于 w 1 w_1 w1并且耐力比第一个人还要久,那么输出-1即可。
#include <bits/stdc++.h>using namespace std;
const int N = 1e6 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
int mod = 1e9+7;
const int maxv = 4e6 + 5;void solve()
{int n;cin>>n;vector<pll> a(n+5);for(int i=1;i<=n;i++) {int x,y;cin>>x>>y;a[i]={x,y};}int v=a[1].second;ll ans=a[1].first;for(int i=2;i<=n;i++){auto [x,y]=a[i];if(y>=v&&x>=ans){cout<<-1<<endl;return ;}}cout<<ans<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;cin>>t;while(t--){solve();}system("pause");return 0;
}
签到。我们发现只要满足对 n n n列来说,只要每一行至少存在一个数就算合法,对于 n n n行而言同理。
#include <bits/stdc++.h>using namespace std;
const int N = 1e6 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
int mod = 1e9+7;
const int maxv = 4e6 + 5;void solve()
{int n;cin>>n;vector<ll> a(n+5),b(n+5);ll sum1=0,sum2=0;ll m1=2e9,m2=2e9;for(int i=0;i<n;i++){cin>>a[i];sum1+=a[i];m1=min(m1,a[i]);}for(int i=0;i<n;i++){cin>>b[i];sum2+=b[i];m2=min(m2,b[i]);}ll ans=min(m1*n+sum2,m2*n+sum1);cout<<ans<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;cin>>t;while(t--){solve();}system("pause");return 0;
}
题意:
给你一个二进制字符串 s s s。二进制字符串是由字符 0 和/或 1 组成的字符串。
您可以对 s s s 执行以下操作 (即使是零) 的任意次数:
您必须让 s s s交替出现,也就是说,在您执行操作后, s s s中每两个相邻的字符应该是不同的。
您的目标是计算两个值:
思路:
对于第一问十分简单,我们只需要计算相同的所有相同的块变为1的数量。
第二问:考虑对于每组块内的删除,若一组块的个数为3,那么该组块有3种删法,根据乘法原理我们可以知道,若我们有 n n n组块,每组块有 a i a_i ai个,那么我们是删除方法有 ∏ i = 0 n a i prod_{i=0}^n{a_i} ∏i=0nai种,又因为题目要求为排列,所以再乘以所有块数的阶乘即可。
#include <bits/stdc++.h>using namespace std;
const int N = 3e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
int mod = 998244353;
const int maxv = 4e6 + 5;void solve()
{string s;cin>>s;int cnt=1;vector<int> a;for(int i=1;i<s.size();i++){if(s[i]==s[i-1]) cnt++;else {a.push_back(cnt);cnt=1;}}if(cnt>1) a.push_back(cnt);ll ans1=0,ans2=1;for(auto x: a){ans1+=(x-1);ans1%=mod;ans2=ans2*x%mod;}for(int i=1;i<=ans1;i++){ans2=ans2*i%mod;}cout<<ans1<<" "<<ans2<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t = 1;cin>>t;while (t--){solve();}system("pause");return 0;
}
题意:
给你一个长度为 n n n 的数组 a a a ,由非负整数组成。
您必须计算 ∑ l = 1 n ∑ r = l n f ( l , r ) ⋅ ( r − l + 1 ) sum_{l=1}^{n} sum_{r=l}^{n} f(l, r) cdot (r - l + 1) ∑l=1n∑r=lnf(l,r)⋅(r−l+1) 的值,其中 f ( l , r ) f(l, r) f(l,r) 是 a l ⊕ a l + 1 ⊕ ⋯ ⊕ a r − 1 ⊕ a r a_l oplus a_{l+1} oplus dots oplus a_{r-1} oplus a_r al⊕al+1⊕⋯⊕ar−1⊕ar(字符 ⊕ oplus ⊕ 表示位向 XOR)。
由于答案可能非常大,因此请打印它的模数 998244353 998244353 998244353。
思路:拆位算贡献
s k = ⨁ i = 1 k a i f ( l , r ) = ⨁ i = l r a i = s r ⊕ s l − 1 begin{align*} s_k &= bigoplus_{i=1}^ka_i \ f(l,r) &= bigoplus_{i=l}^r a_i \ &= s_r oplus s_{l-1} end{align*} skf(l,r)=i=1⨁kai=i=l⨁rai=sr⊕sl−1
a n s = ∑ l = 1 n ∑ r = l n f ( l , r ) ⋅ ( r − l + 1 ) = ∑ l = 1 n ∑ r = l n f ( l , r ) ⋅ r − f ( l , r ) ⋅ ( l − 1 ) = ∑ l = 0 n ∑ r = l n ( ∑ i = 0 32 2 i ∗ ( ( s r & 2 i ) ⊕ ( s l & 2 i ) ) ∗ ( r − l ) ) begin{align*} ans &= sum_{l= 1}^nsum_{r=l}^n f(l,r)cdot(r - l + 1) \ &= sum_{l= 1}^nsum_{r=l}^n f(l,r)cdot r- f(l,r)cdot (l - 1)\ &= sum_{l= 0}^nsum_{r=l}^n (sum_{i = 0} ^ {32} 2^{i} * ((s_r & 2^i) oplus (s_l &2^i))*(r - l))\ end{align*} ans=l=1∑nr=l∑nf(l,r)⋅(r−l+1)=l=1∑nr=l∑nf(l,r)⋅r−f(l,r)⋅(l−1)=l=0∑nr=l∑n(i=0∑322i∗((sr&2i)⊕(sl&2i))∗(r−l))
那么每个数每一位的贡献为:
r e s = 2 i [ ( r − l 1 ) + ( r − l 2 ) + . . . + ( r − l k ) ] = 2 i [ k r − ∑ i = 1 k l i ] begin{align*} res& =2^i [(r-l_1) + (r - l_2) + ... + (r - l _k)]\ &=2^i[kr - sum_{i = 1}^kl_i] end{align*} res=2i[(r−l1)+(r−l2)+...+(r−lk)]=2i[kr−i=1∑kli]
#include <bits/stdc++.h>using namespace std;
const int N = 3e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
int mod = 998244353;
const int maxv = 4e6 + 5;ll f[N][35], c[N][35];void solve()
{int n;cin >> n;vector<ll> a(n + 5);vector<ll> s(n + 5);for (int i = 1; i <= n; i++)cin >> a[i];for (int i = 1; i <= n; i++)s[i] = s[i - 1] ^ a[i];ll ans = 0;for (int i = 0; i <= n; i++){for (int j = 0; j <= 30; j++){f[j][(s[i] >> j) & 1]=(f[j][(s[i] >> j) & 1]+1)%mod;c[j][(s[i] >> j) & 1]=(c[j][(s[i] >> j) & 1]+i)%mod;}for (int j = 0; j <= 30; j++){ans = (ans + (1ll << j)%mod * ((f[j][(s[i] >> j & 1) ^ 1]%mod * (ll)i - c[j][(s[i] >> j & 1) ^ 1])%mod+mod) % mod) % mod;}}cout << ans << endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t = 1;// cin>>t;while (t--){solve();}system("pause");return 0;
}
本文发布于:2024-02-01 20:58:56,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170679233539381.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |