Codeforces Round 897 (Div. 2)
思路:
记录原数组中从大到小的值,并输出原数组对应的大小的值
#include
using namespace std;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(v) ((int)v.size())
#define fs first
#define sc second
const int N=2e6+10,M=2e5;
typedef double db;
typedef pairpii;
int n,m,k,Q,cnt,t;
vectordel;
int a[200010],b[200010];
int prime[N];
bool st[N];
mapmp;
struct node{
int x,id;
bool operator<(const node &w)const{
return x>w.x;
}
}tr[N];
void solve(){
cin>>n;
rep(i,1,n){
int x;
cin>>x;
tr[i]={x,i};
}
sort(tr+1,tr+1+n);
rep(i,1,n){
b[tr[i].id]=i;
}
rep(i,1,n)cout<>t;
while(t--)solve();
}
思路:
我们可以发现,当如果里面对称位置不相等的时候那么一定会存在一个一,如果对应位置相等的话,那么可以是全为1也可以全为0,所以我们最少的一的次数就是不相等位置的次数,当将不相等位置都排完后,我们对应偶数位置才能输出1,因为,成对的位置相等,他们是一起的,你只能选全为1和全为0,最后就是奇数是特殊的,中间那个可以是1也可以是0,所以奇数中间就不用判断偶数位置还是奇数位置
#include
using namespace std;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(v) ((int)v.size())
#define fs first
#define sc second
const int N=2e6+10,M=2e5;
typedef double db;
typedef pairpii;
int n,m,k,Q,cnt,t;
vectordel;
int a[200010],b[200010];
int prime[N];
bool st[N];
mapmp;
struct node{
int x,id;
bool operator<(const node &w)const{
return x>w.x;
}
}tr[N];
void solve(){
string s;
cin >> n >> s;
s = " " + s;
int cnt = 0;
for (int i = 1; i <= n / 2; i++)
cnt += (s[i] != s[n - i + 1]);
if (n & 1)
for (int i = 0; i <= n; i++)
if (i >= cnt && i <= n - cnt)
cout << '1';
else
cout << '0';
else
for (int i = 0; i <= n; i++)
if (i >= cnt && i <= n - cnt && (i - cnt) % 2 == 0)
cout << '1';
else
cout << '0';
cout << endl;
}
signed main(){
cin>>t;
while(t--)solve();
}
不会交互
给个大佬的
void solve()
{
int n, x = 0, y;
cin >> n;
vector a(n + 1);
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
if (a[i] == x)
x++;
while (1)
{
cout << x << endl;
cout.flush();
cin >> x;
if (y == -1)
break;
x = y;
}
}
思路:
对位置和点权建边,跑强连通。
如果一个点位于单链上,分析可知一定可以完成赋值的,因为总存在一个点不需要对其他点负责,而且也可以多次对一个点覆盖。如果一个点位于强连通分量上,显然要大小等于 k
#include
#define itn int
#define all(x) (x).begin(), (x).end()
#define make_unique(x) sort(all((x))); (x).resize(unique(all((x))) - (x).begin())
using namespace std;
inline int nxt() {
int x;
cin >> x;
return x;
}
void solve() {
int n = nxt(), k = nxt();
vector a(n);
for (int& x : a) {
x = nxt() - 1;
}
if (k == 1) {
for (int i = 0; i < n; ++i) {
if (a[i] != i) {
cout << "No\n";
return;
}
}
cout << "Yes\n";
return;
}
vector used(n);
for (int i = 0; i < n; ++i) {
if (used[i]) {
continue;
}
int v = i;
while (!used[v]) {
used[v] = 1;
v = a[v];
}
if (used[v] == 1) {
int cnt = 0;
int u = v;
do {
++cnt;
u = a[u];
} while (u != v);
if (cnt != k) {
cout << "No\n";
return;
}
}
for (int v = i; used[v] != 2; v = a[v]) {
used[v] = 2;
}
}
cout << "Yes\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int t = nxt();
while (t--) {
solve();
}
return 0;
}