QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#590839#8781. Element-Wise ComparisonericmegalovaniaRE 0ms3860kbC++203.4kb2024-09-26 12:00:242024-09-26 12:00:26

Judging History

你现在查看的是最新测评结果

  • [2024-09-26 12:00:26]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:3860kb
  • [2024-09-26 12:00:24]
  • 提交

answer

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

#define ONLINE
#ifndef ONLINE
char DEBUG_BUFFER[1000];
#define debug(...) {sprintf(DEBUG_BUFFER,##__VA_ARGS__);\
cerr<<"\033[1;36m"<<DEBUG_BUFFER<<"\033[0;2m"<<"\033[0m";}
#else
#define debug(...) ;
#endif

using LL=long long;
using PII=pair<int,int>;

#define all(x) (x).begin(),(x).end()
#define allr(x) (x).rbegin(),(x).rend()

#define FAST_IO {ios::sync_with_stdio(false);cin.tie(nullptr);}
inline int read(){static int x; cin>>x; return x;}
inline LL readLL(){static LL x; cin>>x; return x;}
mt19937_64 rng(chrono::system_clock::now().time_since_epoch().count());

struct Bitset{
	using ULL=unsigned long long;
	static const ULL o=1;
	vector<ULL>a;
	int N,back_siz;
	void reset(){
		a.assign(N,0);
	}
	void set(){
		a.assign(N,1);
		a.back()=(o<<back_siz)-1;
	}
	Bitset(const int& N_=0,const bool& _=0){
		N=(N_-1)/64+1;
		back_siz=N_-(N-1)*64;
		_?set():reset();
	}
	void flip(int x){
		a[x>>6]^=o<<(x&63);
	}
	void reset(int x){
		a[x>>6]&=~(o<<(x&63));
	}
	void set(int x){
		a[x>>6]|=o<<(x&63);
	}
	int test(int x){
		return (a[x>>6]>>(x&63))&1;
	}
	Bitset operator ~() const{
		Bitset ret(N);
		for(int i=0;i<N;i++){
			ret.a[i]=~a[i];
		}
		return ret;
	}
	Bitset operator &(const Bitset &b) const{
		Bitset ret(N);
		for(int i=0;i<N;i++){
			ret.a[i]=a[i]&b.a[i];
		}
		return ret;
	}
	Bitset operator |(const Bitset &b) const{
		Bitset ret;
		for(int i=0;i<N;i++){
			ret.a[i]=a[i]|b.a[i];
		}
		return ret;
	}
	Bitset operator ^(const Bitset &b) const{
		Bitset ret;
		for(int i=0;i<N;i++){
			ret.a[i]=a[i]^b.a[i];
		}
		return ret;
	}
	Bitset operator <<(const int& t) const{
		Bitset ret;
		ULL last=0;
		int high=t>>6,low=t&63;
		for(int i=0;i+high<N;i++)
		{
			ret.a[i+high]=last|(a[i]<<low);
			if(low)last=a[i]>>(64-low);
		}
		return ret;
	}
	Bitset operator >>(const int& t) const{
		Bitset ret;
		ULL last=0;
		int high=t>>6,low=t&63;
		for(int i=N-1;i>=high;i--)
		{
			ret.a[i-high]=last|(a[i]>>low);
			if(low)last=a[i]<<(64-low);
		}
		return ret;
	}
	char* str() const{
		string s="";
		for(int i=N-1;i>=0;i--){
			for(int j=63;j>=0;j--){
				s.push_back('0'+(a[i]>>j&1));
			}
		}
		return s.data();
	}
	int count() const{
		int ret=0;
		for(auto x:a){
			debug("\t%llu %d\n",x,__builtin_popcountll(x));
			ret+=__builtin_popcountll(x);
		}
		return ret;
	}
};

int main(){
	FAST_IO;
	int n=read(),m=read();
	vector<int>pos(n);
	for(int i=0;i<n;i++){
		pos[read()-1]=i;
	}
	vector f(n,Bitset(n+1));
	vector suf(m,Bitset(n+1));
	Bitset tmp(n+1);
	for(int x=n-1;x>=0;x--){
		f[pos[x]]=tmp>>pos[x];
		tmp.set(pos[x]);
	}
#ifndef ONLINE
	for(int i=0;i<n;i++){
		debug("f[%d]=%s\n",i+1,f[i].str());
	}
#endif
	LL ans=0;
	for(int i=0,last=-1;i<n-m+1;i++){
		debug("i=%d\n",i);
		if(i>last){
			last+=m;
			suf[0]=f[last];
			for(int j=1;j<m;j++){
				suf[j]=suf[j-1]&f[last-j];
			}
#ifndef ONLINE
			debug("update suf\n");
			debug("\tlast=%d\n",last+1);
			for(int j=0;j<m;j++){
				debug("suf[%d]=%s\n",j+1,suf[j].str());
			}
#endif
			tmp.set();
		}
		ans+=(suf[last-i]&tmp).count();
		if(i+m<n) tmp=tmp&f[i+m];
	}
	cout<<ans;
	return 0;
}

/* stuff you should look for
* int overflow, array bounds
* special cases (n=1?)
* do smth instead of nothing and stay organized
* WRITE STUFF DOWN
* DON'T GET STUCK ON ONE APPROACH
*/

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3860kb

input:

5 3
5 2 1 3 4

output:

0

result:

ok answer is '0'

Test #2:

score: 0
Accepted
time: 0ms
memory: 3656kb

input:

5 2
3 1 4 2 5

output:

2

result:

ok answer is '2'

Test #3:

score: 0
Accepted
time: 0ms
memory: 3812kb

input:

4 2
1 2 3 4

output:

3

result:

ok answer is '3'

Test #4:

score: 0
Accepted
time: 0ms
memory: 3812kb

input:

4 2
4 3 2 1

output:

0

result:

ok answer is '0'

Test #5:

score: 0
Accepted
time: 0ms
memory: 3556kb

input:

1 1
1

output:

0

result:

ok answer is '0'

Test #6:

score: -100
Runtime Error

input:

50000 2
44045 29783 5389 7756 44022 45140 21967 5478 10868 49226 21775 31669 49836 13511 46116 14229 27206 31168 37389 3158 10658 41154 14635 18526 40540 6451 23197 46719 30593 13517 8604 46666 39189 43746 12778 3684 3194 36979 43020 14652 19549 31178 17144 27177 44336 2849 40220 11751 41993 32209 4...

output:


result: