TLE on #6,弹飞绵羊已过
查看原帖
TLE on #6,弹飞绵羊已过
799536
Cold_Eyes_bystander楼主2024/6/29 19:12

rt,讨论区所有方法的试过了。

#include <bits/stdc++.h>
using namespace std;
int a[1919810],b[1919810],c[1919810];
int d[1919810],e[1919810];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    int n1=n,cnt=1,last=0,cnt1=n%int(int(sqrt(n))*1.2);
    while(n1>=0)
    {
        int now=int(int(sqrt(n))*1.2)*cnt;
        if(cnt<=cnt1) now++;
        d[cnt]=now;
        cnt++;
        n1-=now-last;
        if(n1<0) break;
        b[now]=1;
        c[now]=now+a[now];
        e[now]=now;
//        cout<<b[now]<<" "<<c[now]<<endl;
        for(int i=now-1;i>=last+1;i--)
        {
        	if(i+a[i]>now)
        	{
        		b[i]=1;
        		c[i]=i+a[i];
        		e[i]=i;
			}
			else
			{
				b[i]=b[i+a[i]]+1;
				c[i]=c[i+a[i]];
				e[i]=e[i+a[i]];
			}
		}
		last=now;
    }
    b[n]=1;
    c[n]=n+a[n];
    e[n]=n;
    for(int i=n;i>=last+1;i--)
    {
    	if(i+a[i]>n)
    	{
    		b[i]=1;
    		c[i]=i+a[i];
    		e[i]=i;
    		continue;
		}
		
		b[i]=b[i+a[i]]+1;
		c[i]=c[i+a[i]];
		e[i]=e[i+a[i]];
	}
	if(last!=n) cnt++;
	cnt--;
    for(int i1=1;i1<=m;i1++)
    {
    	int x;
    	cin>>x;
    	if(x==1)
    	{
    		int q,sum=0;
    		cin>>q;
    		int sum1=0;
    		while(q<=n)
    		{
    			sum1=e[q];
    			sum+=b[q];
    			q=c[q];
			}
			cout<<sum1<<" "<<sum<<"\n";
		}
		else
		{
			int j,k;
			cin>>j>>k;
			a[j]=k;
			for(int l=1;l<=cnt-1;l++)
			{
				if(d[l]>=j&&d[l-1]<j)
				{
					b[d[l]]=1;
			        c[d[l]]=d[l]+a[d[l]];
			        e[d[l]]=d[l];
//			        cout<<b[d[j]]<<" "<<c[d[j]]<<endl;
			        for(int i=d[l]-1;i>=d[l-1]+1;i--)
			        {
			        	if(i+a[i]>d[l])
			        	{
			        		b[i]=1;
			        		c[i]=i+a[i];
			        		e[i]=i;
			        		continue;
						}
						b[i]=b[i+a[i]]+1;
						c[i]=c[i+a[i]];
						e[i]=e[i+a[i]];
//						cout<<b[i]<<" "<<c[i]<<endl;
					}
					break;
				}
			}
		}
	}
    return 0;
}
2024/6/29 19:12
加载中...